我有一个给定的练习,希望我找到大写字母,也就是字母中的K位,在这个例子中,char变量叫做C,范围是从A到Z的大写字母。
例如,如果输入是B 3,则输出应该是E。对于这个特定的输入,它很简单,你只要把值和起来,得到你的答案,但是,例如,如果我们超出了范围,怎么办?下面是一个例子,F 100程序应该输出B,因为如果值大于Z,则程序从A开始。
如果有一些困惑,我会尝试解释它,这里有一些测试用例和我的代码,只有当我们不跨越范围时才能工作。
Input Output
B 3 E
X 12345 S
F 100 B
T 0 T#include <stdio.h>
int main(){
int K;
char C,rez;
scanf("%c %d",&C,&K);
int ch;
for(ch = 'A';ch <= 'Z';ch++){
if(C>='A' && C<='Z'){
rez = C+K;
}
}
printf("%c",rez);
return 0;
}发布于 2021-12-17 12:10:45
假设字母and是基数26,其中零是A,一个是B,25是Z。
由于字母(在基数26中)和偏移量之和,它只是我们感兴趣的最小基数26位,所以使用%查找最小有效基数26位,就像使用% 10查找最小有效小数位一样。
scanf(" %c %d",&C,&K);
// ^ space added to consume any white-space
if (C >= 'A' && C <= 'Z') {
int base26 = C - 'A';
base26 = base26 + K;
base26 %= 26;
int output = base26 + 'A';
printf("%c %-8d %c\n", C, K, output);
}对于负偏移,我们需要在%中做更多的工作,不是mod操作符,而是其余的。这个带有负操作数的differs。
base26 %= 26;
if (base < 0) base26 += 26; // add
int output = base26 + 'A';从脚踏实地来看,C + K可能会溢出极端的K值。要说明这一点,请在添加之前减少K。
// base26 = C + K;
base26 = C + K%26;我们可能有点偷偷摸摸,加上26,以确保总数不是负数。
if (C >= 'A' && C <= 'Z') {
int base26 = C - 'A';
base26 = base26 + K%26 + 26; // base26 >= 0, even when K < 0
base26 %= 26; // base26 >= 0 and < 26
int output = base26 + 'A';
printf("%c %-8d %c\n", C, K, output);
}..。或者做一条复杂的单线
printf("%c %-8d %c\n", C, K, (C - 'A' + K%26 + 26)%26 + 'A');发布于 2021-12-17 12:13:03
这可以通过使用两个概念来实现。
在C中,每个字符都有一个ASCII值。基本上从0到127。字符A的值为65,B的值为66 (65 + 1),等等。直到Z等于65 + 25 = 90
我想在数学中强调的第二个概念是模运算,如果你总是想把一个数字映射到一定的范围,你可以使用模数运算符。模是一个数字除以另一个数后得到的提醒。在我们的例子中,我们有26个字母,所以我们总是可以得到一个0到25之间的数字。
例如,取100 % 26 = 22,但也必须考虑起点。
因此,我们总是用'A‘的值减去初始字母表,即65,这样'A’映射为0,'Z‘映射为25。
所以,如果我们从“F”开始,需要去100个地方。
中。
在这种情况下,'F‘- 'A’=5
,
来计算模量。
你就完蛋了
发布于 2021-12-17 12:44:34
使用模运算符用26获取输入号的剩余部分。如果输入字符和余数之和小于或等于Z,则它的答案将再次找到26的和余数,这将是答案(注意偏移,因为字母A的ASCII十进制值为65)。
执行工作大致如下:
#include <stdio.h>
int main(){
int K;
char C, rez;
scanf("%c %d",&C,&K);
// Validate the user input
int ch;
int rem = K % 26;
if ((rem + C) - 'A' < 26) {
rez = rem + C;
} else {
rez = ((rem + C - 'A') % 26) + 'A';
}
printf("%c\n",rez);
return 0;
}请注意,我知道在实现方面还有改进的余地。但这只是给OP一个关于如何去做的想法。
输出:
# ./a.out
B 3
E
# ./a.out
X 12345
S
# ./a.out
F 100
B
# ./a.out
T 0
Thttps://stackoverflow.com/questions/70392814
复制相似问题