(C)在ASCII图表中向前移动x次但仍保持在a-z之间的最佳方法?

时间:2013-11-12 21:10:43

标签: c while-loop ascii

基本上你输入一个单词然后输入一个数字。该程序采用ASCII中的每个字符和步骤。防爆。 “你好”,数字1返回“ifmmp”。 现在,如果我输入的数字大于字符的ASCII值和组合的数字,我会得到不是a-z的字符。为了使它保持在a-z,我做了一个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 个答案:

答案 0 :(得分:2)

哦,我的。

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

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

答案 1 :(得分:0)

使用循环将每个值递增1并不是您想要的...您只需一次累积,然后进行单次循环(如果需要回绕)。

要做的第一件事是将大数字减少到仍然具有相同结果的最小数字。由于在回绕之前只有26个值,因此您只需设置number = number % 26;或更一般地设置number = number % (1 + 'z' - 'a');

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

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

答案 2 :(得分:0)

修改char以使ascii char'a'为零,添加你的值,然后制作%26

像那样:

answer[x] = (word[x]-'a'+number)%26+'a';

答案 3 :(得分:0)

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

为答案干杯:)