求大佬!
题目:写一个凯撒加密程序。#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)是什么意思啊? 假设你输入的是 '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: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 是为了把密文字符偏移直接转换为密文字符。
所以,取余操作是为了防范密文字符偏移超出正常范围而附加的保障措施。 jackz007 发表于 2021-12-17 00:07
ch - 'a' 得到字符 ch 对 'a' 的偏移,0 是 'a',25 是 'z'。
ch - 'a' + 3 为了加密,调整 c ...
那x怎么变成a的啊
余数不是0吗? 何艺铧 发表于 2021-12-17 09:44
那x怎么变成a的啊
余数不是0吗?
余数是 0,那不就是 'a' 吗,好好想想。是不是 'a' - 'a' = 0
页:
[1]