题目描述
已知的最古老的一种加密技术是凯撒加密(得名于Julius
Caesar)。该方法把一条消息中的每个字母用字母表中固定距离之后的那个字母来替代。(如果越过了字母Z,会绕回到字母表的起始位置。例如,如果每个字母都用字母表中两个位置之后的字母代替,那么Y就被替换为A,Z就被替换为B。)编写程序用凯撒加密方法对消息进行加密。用户输入待加密的消息和移位计数(字母移动的位置数目,取值为1-25):
Go ahead, make my day.
3
Jr dkhdg, pdnh pd gdb.
注意,当用户输入26与移位计数的差值时,程序可以对消息进行解密:
Jr dkhdg, pdnh pd gdb.
23
Go ahead, make my day.
可以假定消息的长度不超过80个字符。不是字母的那些字符不要改动。此外,加密时不要改变字母的大小写。输入
1、输入待加密的消息,以逗号"."结尾,限度最大长度为80个字符;
2、输入移位计数(字母移动的位置数目,取值为1-25)。输出
输出加密后的消息。
样例输入
Go ahead, make my day. 3
样例输出
Jr dkhdg, pdnh pb gdb.
提示
为了解决前面提到的绕回问题,可以用表达式((ch - ‘A’)+ n)% 26 +
'A’计算大写字母的密码,其中ch存储字母,n存储移位计数。(小写字母也需要一个类似的表达式。)
#include <stdio.h>
#define Max 80
int main(void)
{
char a[Max];
int k, i, n;
for (k = 0; k < Max; k++)
{
if ((a[k] = getchar()) == '.')
{
break;
}
}
scanf("%d", &n);
for (i = 0; i <= k; i++)
{
if (a[i] >= 65 && a[i] <= 90)
{
a[i] = ((a[i] - 'A') + n) % 26 + 'A';
}
else if (a[i] >= 97 && a[i] <= 122)
{
a[i] = ((a[i] - 'a') + n) % 26 + 'a';
}
putchar(a[i]);
}
return 0;
}