将 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 程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C 中制作一个将 int 替换为 char 的程序(不使用 while/for)?

char到int的转换

C语言各类数据类型间的混合运算

经典递归小程序--汉诺塔

将 char 转换为 int 的奇怪错误(目标 C)

在Java中,两个字符相加的结果是int还是char?