首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C程序,它将字符与int相加

问C程序,它将字符与int相加
EN

Stack Overflow用户
提问于 2021-12-17 11:57:37
回答 3查看 299关注 0票数 1

我有一个给定的练习,希望我找到大写字母,也就是字母中的K位,在这个例子中,char变量叫做C,范围是从A到Z的大写字母。

例如,如果输入是B 3,则输出应该是E。对于这个特定的输入,它很简单,你只要把值和起来,得到你的答案,但是,例如,如果我们超出了范围,怎么办?下面是一个例子,F 100程序应该输出B,因为如果值大于Z,则程序从A开始。

如果有一些困惑,我会尝试解释它,这里有一些测试用例和我的代码,只有当我们不跨越范围时才能工作。

代码语言:javascript
复制
Input    Output
B 3        E
X 12345    S
F 100      B
T 0        T
代码语言:javascript
复制
#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;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-12-17 12:10:45

假设字母and是基数26,其中零是A,一个是B,25是Z。

由于字母(在基数26中)和偏移量之和,它只是我们感兴趣的最小基数26位,所以使用%查找最小有效基数26位,就像使用% 10查找最小有效小数位一样。

代码语言:javascript
复制
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。

代码语言:javascript
复制
  base26 %= 26;
  if (base < 0) base26 += 26; // add
  int output = base26 + 'A';

从脚踏实地来看,C + K可能会溢出极端的K值。要说明这一点,请在添加之前减少K。

代码语言:javascript
复制
  // base26 = C + K;
  base26 = C + K%26;

我们可能有点偷偷摸摸,加上26,以确保总数不是负数。

代码语言:javascript
复制
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);
}

..。或者做一条复杂的单线

代码语言:javascript
复制
  printf("%c %-8d %c\n", C, K, (C - 'A' + K%26 + 26)%26  + 'A');
票数 2
EN

Stack Overflow用户

发布于 2021-12-17 12:13:03

这可以通过使用两个概念来实现。

  1. ASCII值
  2. Modulus算子(%)

在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个地方。

  1. 从F值中减去A值。字符的行为类似于数字,因此您可以将'F‘- 'A’存储在整数

中。

在这种情况下,'F‘- 'A’=5

,

  1. ,接下来,我们将偏移量添加到这里。5+ 100 =105个

  1. ,然后我们用26 105 % 26 = 1

来计算模量。

  1. 最后将'A‘的值添加回结果'A’+1= 'B'

你就完蛋了

票数 1
EN

Stack Overflow用户

发布于 2021-12-17 12:44:34

使用模运算符用26获取输入号的剩余部分。如果输入字符和余数之和小于或等于Z,则它的答案将再次找到26的和余数,这将是答案(注意偏移,因为字母A的ASCII十进制值为65)。

执行工作大致如下:

代码语言:javascript
复制
#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一个关于如何去做的想法。

输出:

代码语言:javascript
复制
# ./a.out
B 3
E
# ./a.out
X 12345
S
# ./a.out
F 100
B
# ./a.out
T 0
T
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70392814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档