top1编程
← 返回题目
题解

【入门】简单加密

1 条题解

  • 0
    @ 2026-7-31 20:42:33

    解题思路

    凯撒密码:加密的时候,明文字母用字母表里它后面第 5 位的字符代替。所以解密的时候,把密文字母往前数 5 位,就得到明文。

    比如密文是 F,往前数 5 位就是 A,所以 F 对应明文 A。密文是 A,往前数 5 位要循环回末尾,就是 V。

    思路:逐字符处理。

    1. 用 getline 读入整行密文(因为里面有空格和逗号)
    2. 对每个字符:
      • 如果是大写字母,就把它往前移 5 位
      • 不是字母(空格、逗号等)就保持不变
    3. 把结果输出

    往前移 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