题目
分析
这一题虽然简单,但很有意义。一些初学者学习了数组后接触这样的题目时,还是会很糊涂。
这里有一个很淳朴、很重要的映射概念。
映射
简单说,映射就是将一个“东西”和另一个“东西”加以关联。
我们知道,计算机很擅长处理数字,而且擅长处理“连续”的数字,但还有很多别的类型的数值。如果直接处理会很不直观。
联想到我们日常生活中,经常会进行“编号”的工作:苹果是1号,香蕉是2号……这样一来,我们就可以将对“苹果”的操作变成对“1”的操作,从而进入计算机擅长的领域。
回到本题,我们要对字符进行操作。回想到:字符表其实是有顺序的,而且和数字有关:ASCII码。
| 字母 | A | B | C | D | E |
|---|---|---|---|---|---|
| 大写ASCII码 | 65 | 66 | 67 | 68 | 69 |
| 小写ASCII码 | 97 | 98 | 99 | 100 | 101 |
于是,凯撒密码的过程从“一个字符变成另一个字符”改为更直观的:从一个ASCII码变成另一个ASCII码——一个直观的加法过程。
按照题意,n是右移的偏移量,A->D,就是65->68,也就是:\(65+3=68\)。当然,这样的操作可能会“越界”,我们需要“绕回来”——这样的“绕回来”的操作是模运算。
所以,核心代码就是:
int new_pos = s[i] - 'a' + n; //算出s[i]这个字符相对'a'的距离(第几个字母)然后再偏移(到哪个字母)
new_pos %= 26; //防止“越界”,并绕回来
s[i] = 'a' + new_pos; //在加上离'a'的距离
答案

思考
本题约定了密码都由小写字母组成。如果是混合了大小写字母(暂时不考虑其他字符),那么我们还要判定大小写字母。这个就留给读者自己考虑了。
