何艺铧 发表于 2021-12-16 21:05:50

求大佬!

题目:写一个凯撒加密程序。
#include <stdio.h>

int main()
{
      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;
}
putchar('a' + (ch - 'a' + 3) % 26)是什么意思啊?

傻眼貓咪 发表于 2021-12-16 22:34:16

假设你输入的是 'm',理应变成 'p'

'm' 对应 ASCII 编码:109
'p' 对应 ASCII 编码:112
'a' 对应 ASCII 编码:97

运用你的代码:
'a' + (ch - 'a' + 3) % 26
= 'a' + ('m' - 'a' + 3) % 26
= 97 + (109 - 97 + 3) % 26
= 97 + 15
= 112(字符:'p')

jackz007 发表于 2021-12-17 00:07:03

本帖最后由 jackz007 于 2021-12-17 00:16 编辑

'a' + (ch - 'a' + 3) % 26

    ch - 'a' 得到字符 ch 对 'a' 的偏移,0 是 'a',25 是 'z'。
    ch - 'a' + 3 为了加密,调整 ch 对 'a' 的偏移,当 ch 是 'a' 时,密文偏移为 3,对应的密文字符为 'd',我们知道,英语字母一共只有 26 个,当 ch = 'z' 时,对应密文字符的偏移是 ch - 'a' + 3 = 28,显然,已经超出了英语字母的偏移范围(0~25),为了使新的偏移能够回卷到正常值,所以,就有了 (ch - 'a' + 3) % 26 的操作,当 ch = 'z' 时,新的偏移不再是 28,而是 2,对应的密文字符为 'c'。而 'a' + (ch - 'a' + 3) % 26 是为了把密文字符偏移直接转换为密文字符。
       所以,取余操作是为了防范密文字符偏移超出正常范围而附加的保障措施。

何艺铧 发表于 2021-12-17 09:44:48

jackz007 发表于 2021-12-17 00:07
ch - 'a' 得到字符 ch 对 'a' 的偏移,0 是 'a',25 是 'z'。
    ch - 'a' + 3 为了加密,调整 c ...

那x怎么变成a的啊
余数不是0吗?

jackz007 发表于 2021-12-17 10:04:14

何艺铧 发表于 2021-12-17 09:44
那x怎么变成a的啊
余数不是0吗?

      余数是 0,那不就是 'a' 吗,好好想想。是不是 'a' - 'a' = 0
页: [1]
查看完整版本: 求大佬!