将 char 与 int 相加的 C 程序
Posted
技术标签:
【中文标题】将 char 与 int 相加的 C 程序【英文标题】:C program that sums a char with int 【发布时间】:2022-01-20 08:35:59 【问题描述】:我有一个给定的练习,希望我从本例中名为 C 的 char 变量中的字母中找到 K 个位置的大写字母。范围是从 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;
【问题讨论】:
如果重复值太大,您可能需要再次应用从A
开始的规则。
我试图把 if, else ch = 'A' 放在后面,但它没有用我不太明白..
重复做某事需要循环,而不是if
是的,但我要在for
中添加什么?
【参考方案1】:
将字母 [A-Z] 视为 以 26 为底的,其中 0 是 A,1 是 B,25 是 Z。
当我们将字母(以 26 为基数)和偏移量相加时,它只是我们感兴趣的最低有效基数 26 位,因此使用 %
找到最低有效基数 26 位,就像使用 @987654323 一样@ 查找最不重要的十进制位。
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 运算符中,而是在 remainder 中作为%
做更多的工作。这个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');
【讨论】:
嗯,我认为这是不对的,因为当我在编译器中运行它时,它给出了错误的答案 @itmemilan 比仅状态“给出错误答案”更有用地说明输入、看到的输出和预期输出。请详细描述案例。 我的学校网站上有编译器,当我更改此代码时,我得到 B 我得到 R 得到 T 我得到 G 得到 X 我得到 F 和 F 我得到 0 也许这是我的错误,因为我解释了它是如何工作的,我得到了想法,你得到了投票 修复了我的一些草率编码。【参考方案2】:这可以通过使用 2 个概念来实现。
-
ASCII 值
模运算符 (%)
在 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”值。字符的行为类似于数字,因此您实际上可以将 'F' - 'A' 存储在整数中
在这种情况下,'F' - 'A' = 5
接下来我们添加偏移量。 5 + 100 = 105
然后我们用 26 进行取模 105 % 26 = 1
最后将'A'的值加回结果中 'A' + 1 = 'B'
你已经完成了
【讨论】:
【参考方案3】:使用模运算符获取输入数字的余数26
。如果输入字符和余数之和小于或等于Z
,那么它的答案,否则再次找到和26
的余数,这将是答案(注意偏移,因为字母@987654324 的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
T
【讨论】:
以上是关于将 char 与 int 相加的 C 程序的主要内容,如果未能解决你的问题,请参考以下文章