top1编程
← 返回题目
题解

凯撒加密术2

1 条题解

  • 0
    @ 2026-8-5 10:15:42

    解题思路

    凯撒加密非常简单:把每个字母换成它后面的第 n 个字母。可以想象字母们围成一个大圆圈:a→b→c→…→z→a,转着圈数,数到头就绕回开头。

    做法分成三步:

    1. 小写字母:先算出这个字母是第几个,c - 'a';加上 n,再对 26 取模,(c-'a'+n)%26;最后加上 'a' 变回字母。取模 26 就是让 z 往后数的时候能绕回 a。
    2. 大写字母:算法完全一样,只是把 'a' 换成 'A'。
    3. 其他字符:比如数字、标点符号,不是字母,保持原样不动。

    用样例验证: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