#t211. 凯撒密码

凯撒密码

凯撒密码

题目背景

Special for beginners, ^_^

题目描述

凯撒大帝非常聪明,想出了一个简单有效的加密系统:任意给定一个小写英文字母 x\,x,将其后的第 3 个字母作为其加密字母即可,最后 3 个字母则分别对应前 3 个字母。

加密方案如下:

$a\rightarrow d,\,b\rightarrow e,\,c\rightarrow f,\,\cdots,\,x\rightarrow a,\,y\rightarrow b,\,z\rightarrow c$

现在输入一个字符 c\,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 两个样例分别验证,后者才是关键。