题解
【入门】简单加密
1 条题解
-
0
解题思路
凯撒密码:加密的时候,明文字母用字母表里它后面第 5 位的字符代替。所以解密的时候,把密文字母往前数 5 位,就得到明文。
比如密文是 F,往前数 5 位就是 A,所以 F 对应明文 A。密文是 A,往前数 5 位要循环回末尾,就是 V。
思路:逐字符处理。
- 用 getline 读入整行密文(因为里面有空格和逗号)
- 对每个字符:
- 如果是大写字母,就把它往前移 5 位
- 不是字母(空格、逗号等)就保持不变
- 把结果输出
往前移 5 位怎么处理循环? 字母的序号从 0 到 25(A 是 0,Z 是 25)。往前移 5 位就是序号减 5,减完可能变成负数,这时加 26 再取余数,就能循环回字母表末尾。公式:
明文 = (密文序号 - 5 + 26) mod 26
举例:密文 N 的序号是 13,(13 - 5 + 26) mod 26 = 8,序号 8 是 I,所以 N 对应 I,和题目给的关系表一致。
参考代码
#include <iostream> #include <string> using namespace std; int main() { string s; getline(cin, s); // 读入整行密文(含空格和逗号) int len = s.length(); // 密文的长度 // 逐个字符解密 for (int i = 0; i < len; i++) { // 只有大写字母才需要解密 if (s[i] >= 'A' && s[i] <= 'Z') { // 明文字母是密文字母往前数 5 位 // 加 26 再取余,是为了让 A 往回 5 位能循环到 V s[i] = (s[i] - 'A' - 5 + 26) % 26 + 'A'; } // 逗号、空格等非字母字符保持不变 } cout << s; // 输出明文 return 0; }复杂度分析
- 时间复杂度:O(L),L 是密文的长度,每个字符处理一次
- 空间复杂度:O(1),只用了几个变量
- 1