洛谷:P1914:小书童——凯撒密码


洛谷:P1914:小书童——凯撒密码

Table of Contents

题目

P1914:小书童——凯撒密码

分析

这一题虽然简单,但很有意义。一些初学者学习了数组后接触这样的题目时,还是会很糊涂。

这里有一个很淳朴、很重要的映射概念。

映射

简单说,映射就是将一个“东西”和另一个“东西”加以关联。

我们知道,计算机很擅长处理数字,而且擅长处理“连续”的数字,但还有很多别的类型的数值。如果直接处理会很不直观。

联想到我们日常生活中,经常会进行“编号”的工作:苹果是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'的距离

答案

Solution

思考

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

Previous Next