救赎自我- 发表于 2022-4-21 10:49:10

S1E15凯撒加密程序求教

答案代码如下,其中这两句putchar('a' + (ch - 'a' + 3) % 26);   putchar('A' + (ch - 'A' + 3) % 26);请问是什么含义呢?{:10_277:}




#include <stdio.h>

int main(void)
{
      int ch;

      printf("请输入明文:");

      while ((ch = getchar()) != '\n')
      {
                if (ch >= 'a' && ch <= 'z')
                {
                        putchar('a' + (ch - 'a' + 3) % 26);
//                        continue;
                }

                if (ch >= 'A' && ch <= 'Z')
                {
                        putchar('A' + (ch - 'A' + 3) % 26);
//                        continue;
                }

//                putchar(ch);
      }

      putchar('\n');

      return 0;
}

风车呼呼呼 发表于 2022-4-21 11:03:31

这不就是后移3位吗

jackz007 发表于 2022-4-21 11:41:09

       当 ch 是一个小写字母的时候,ch - 'a' 的数值为 0 ~ 25,就是说,'a' + 0 = 'a' ,'a' + 25 = 'z'。那么,ch - 'a' + 3 的数值范围变成了 3 ~ 28,这个数值范围显然已经偏离了小写字母的正常偏移范围,虽然 'a' + 3 = 'd',那么,'a' + 28 是什么字母?'a' ~ 'c' 又到哪里去了?如果将这个数值对 26 取余,(ch - 'a' + 3) % 26,那么,当 ch - 'a' + 3 的值是 3~25 的时候,取不取余结果一样,当数值是 26~28 的时候,相对应的余数是 0 ~ 2,这正是我们想要的,于是,字母偏移的数值范围又重新被调整回了 0 ~ 25,从而覆盖了英文字母的正常范围。ch 是大写字母时的情况完全参照小写字母。
      

救赎自我- 发表于 2022-4-21 11:42:30

本帖最后由 救赎自我- 于 2022-4-21 11:48 编辑

救赎自我- 发表于 2022-4-21 11:48:04

jackz007 发表于 2022-4-21 11:41
当 ch 是一个小写字母的时候,ch - 'a' 的数值为 0 ~ 25,就是说,'a' + 0 = 'a' ,'a' + 25 = 'z' ...

感谢大佬耐心讲解我悟了{:10_279:}
页: [1]
查看完整版本: S1E15凯撒加密程序求教