题解
凯撒加密术2
1 条题解
-
0
解题思路
凯撒加密非常简单:把每个字母换成它后面的第 n 个字母。可以想象字母们围成一个大圆圈:a→b→c→…→z→a,转着圈数,数到头就绕回开头。
做法分成三步:
- 小写字母:先算出这个字母是第几个,
c - 'a';加上 n,再对 26 取模,(c-'a'+n)%26;最后加上'a'变回字母。取模 26 就是让z往后数的时候能绕回 a。 - 大写字母:算法完全一样,只是把
'a'换成'A'。 - 其他字符:比如数字、标点符号,不是字母,保持原样不动。
用样例验证:
abcdz每个字母往后移 1 位:a→b、b→c、c→d、d→e、z→a(绕回),得到bcdea,和样例一致。参考代码
// P4555 凯撒加密术2:每个字母替换成它后面第n个字母 #include <iostream> #include <string> using namespace std; int main() { string s; int n; cin >> s >> n; // 读入待加密字符串和位移n for (int i = 0; i < s.size(); i++) { char c = s[i]; if (c >= 'a' && c <= 'z') // 小写字母后移n位,越界回绕 c = 'a' + (c - 'a' + n) % 26; else if (c >= 'A' && c <= 'Z') // 大写字母同理 c = 'A' + (c - 'A' + n) % 26; // 其他非字母字符保持不变 s[i] = c; } cout << s << endl; return 0; }复杂度分析
- 从头到尾把每个字符处理一遍,每个字符的计算都是常数时间。
- 总时间复杂度 O(L),空间复杂度 O(1),L 是字符串长度(不超过 20)。
- 小写字母:先算出这个字母是第几个,
- 1