#t211. 凯撒密码
凯撒密码
凯撒密码
题目背景
Special for beginners, ^_^
题目描述
凯撒大帝非常聪明,想出了一个简单有效的加密系统:任意给定一个小写英文字母,将其后的第 3 个字母作为其加密字母即可,最后 3 个字母则分别对应前 3 个字母。
加密方案如下:
$a\rightarrow d,\,b\rightarrow e,\,c\rightarrow f,\,\cdots,\,x\rightarrow a,\,y\rightarrow b,\,z\rightarrow c$
现在输入一个字符,请你给出其加密后的字母吧!
输入格式
一个英文小写字母。
输出格式
一个英文小写字母,为加密后的字母。
样例输入 1
a
样例输出 1
d
样例输入 2
x
样例输出 2
a
数据范围
1s, 1024KiB for each test case.
提示
一、字母可以当数字用
char 的本质是 ASCII 编号,所以能直接参与算术。最有用的一招是「减去起点」:
char c = 'd';
int idx = c - 'a'; // 3 ('d'=100,'a'=97,差 3)
char back = 'a' + 3; // 'd'
这样 'a'~'z' 就映射成 0~25,做加减法方便得多。大写同理:c - 'A'。
二、偏移后要「绕回来」
字母只有 26 个。序号加偏移量后可能超过 25,必须对 26 取余:
int k = 3;
char c = 'y';
char enc = 'a' + (c - 'a' + k) % 26; // 'y'(24)+3=27 → 27%26=1 → 'b'
拆开看:c - 'a' 得到 0~25 → 加上偏移 → % 26 绕回 0~25 → 加 'a' 变回字母。
三、常见错误
- 忘了
% 26:'y' + 3变成|(ASCII 124),不是字母。 - 大小写混用:处理小写却减了
'A',序号全错。 - 偏移是负数时(解密),
(x - k) % 26可能得到负数,要写成((x - k) % 26 + 26) % 26。
四、自检
取 'a' 和 'z' 两个边界试:偏移后应该仍然是字母,且 'z' 加 1 应该回到 'a'。
- 先把字母变成 0~25 的序号,这一步是整题的关键。
- 加 3 之后对 26 取余,想一想为什么这样就能绕回开头。
- 把结果换回字符再输出。
自查:用
a → d和x → a两个样例分别验证,后者才是关键。