0

基本上你输入一个单词,然后输入一个数字。该程序以 ASCII 格式获取每个字符并前进。前任。“你好”,数字 1 返回“ifmmp”。现在,如果我要输入一个大于字符的 ASCII 值和该数字组合的数字,我会得到不是 az 的字符。为了让它保持在 az 我做了一个 while 循环,我的问题是:

如果我输入 ~5000 的值,我可以在不循环 5000 次的情况下执行此操作吗?

(单词、数字、答案和 x 在前面声明)

int countNumber = word[x];
int countComplete = word[x];    

if(word[x] + number > 122){
    while(countNumber != number) {
        if(countComplete == 122){
            countComplete = 97;
            countNumber++;
        }
        else{
            countNumber++;
            countComplete++;
        }
    }
    answer[x] = countComplete;
    x++;
}
else{
    answer[x] = word[x] + number;
    x++;
}
4

4 回答 4

2

天啊。

首先,唯一重要的数字是 0..25;其他任何东西都会在整个字母表中做额外的循环。因此,首先用数字%26 替换数字。

但这表明您可以完全消除循环。如果有问题的 ASCII 代码来自 0..25,那么您可以将 ASCII 代码 x 替换为 (x+number)%26。相反,您可以通过减去 a 的 ASCII 代码将 x 映射到该范围,执行刚刚描述的数学运算,然后将该代码加回。

于 2013-11-12T21:17:02.570 回答
0

非常感谢!之前想出了数学,但不知道如何在代码中做到这一点。不知道 v1%v2 划分并返回余数。

为答案干杯:)

于 2013-11-13T08:08:42.507 回答
0

使用循环将每个值加一不是您想要的……您需要一个累加,然后是一个环绕(如果需要环绕)。

首先要做的是将大数减少到仍然具有相同结果的最小数。由于环绕之前只有 26 个值,因此您可以简单地设置number = number % 26;,或者更一般地说,number = number % (1 + 'z' - 'a');

接下来,做积累;answer[x] = word[x] + number;

最后处理环绕:if ([answer[x] > 'z') answer[x] = answer[x] + 'a' - 'z';

于 2013-11-12T21:16:48.413 回答
0

修改 char 使 ascii char 'a' 为零,添加您的值,然后使 % 26

像那样:

answer[x] = (word[x]-'a'+number)%26+'a';
于 2013-11-12T21:19:00.723 回答