繁体   English   中英

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

[英]( C ) Best way to step x number of times forward in the ASCII-chart but still keeping it between a-z?

基本上你输入一个单词然后输入一个数字。 该程序采用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++;
}

天啊。

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

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

使用循环将每个值递增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';

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

像那样:

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

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

为答案干杯:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM