题目描述
【问题描述】
给定一个单词,请使用凯撒密码将这个单词加密。
凯撒密码是一种替换加密的技术,单词中的所有字母都在字母表上向后偏移 3 位后被替换成密文。即 a 变为 d,b 变为 e,…,w 变为z,x 变为 a,y 变为 b,z 变为 c。
【输入描述】
输入一行,包含一个单词,单词中只包含小写英文字母,单词中的字母个数不超过 100。
【输出描述】
输出一行,表示加密后的密文。
【输入输出样例】
输入:
lanqiao
输出:
odqtldr
【运行限制】
• 最大运行时间:1s
• 最大运行内存: 256M
解题思路
printf("%c",num),会输出ASCII码为num的对应字符。
【法一】每个字母有对应的ASCII码,查表可得,a对应的ASCII码是97,z对应的是122。当字母<x时,可以直接+3;但"x",“y”,“z"这三个字母,加密后对应"a”,“b”,“c”,故-23即可。
【法二】
s[i]-97
形成下图以0开头的循环队列(a对应0,b对应1,如此类推),向后偏移 3 位进行加密+3
,为了避免超出范围需要%26
(循环队列中有26个元素),再重新+97
形成加密后字母的ASCII码。
如:“y”对应的ASCII为121,在以0开头的循环队列中对应24,(24+3)%26
为加密后字符的ASCII码。
ASCII码表:百度百科——ASCII码
解题代码
C语言
法一
#include <stdio.h>
#include <string.h>
int main()
{
int i;
char s[101];
gets(s);
int len = strlen(s);
for(i = 0;i<len;i++){
if(s[i] >= 'x'){
s[i] = s[i] - 23;
}
else {
s[i] = s[i] +3;
}
printf("%c",s[i]);
}
return 0;
}
法二
#include <stdio.h>
#include <string.h>
int main()
{
int i;
char s[101];
gets(s);
int len = strlen(s);
for(i=0;i<len;i++){
printf("%c",(s[i]-97+3)%26+97);
}
return 0;
}
测试用例
测试1
输入:
huashang
输出:
kxdvkdqj
测试2
输入:
shukeyuan
输出:
vkxnhbxdq