top1编程
← 返回题目
题解

字符加密术

1 条题解

  • 0
    @ 2026-8-5 12:17:22

    解题思路

    加密的规则有三条:

    1. 大写字母:把它的 ASCII 码加上 n,得到加密后的字符;
    2. 小写字母:把它的 ASCII 码减去 n,得到加密后的字符;
    3. 其他非字母字符(空格、数字、符号等):保持不变。

    什么是 ASCII 码?它是计算机给每个字符编的号,比如 'A' 是 65,'a' 是 97。在 C++ 里可以直接对字符做加减运算,比如 'A' + 3 就等于 'D'。

    做法:

    1. 第一行的字符串可能含空格,所以用 getline(cin, s) 读一整行;第二行用 cin >> n 读加密偏移量。
    2. 用 for 循环遍历字符串的每个字符:
      • 判断是不是大写字母:s[i] >= 'A' && s[i] <= 'Z',是就 s[i] += n;
      • 判断是不是小写字母:s[i] >= 'a' && s[i] <= 'z',是就 s[i] -= n;
      • 其他字符什么都不做。

    用样例验证:Tong Cheng 2023,n=3

    • T(84)+3=87=W,o(111)-3=108=l,n-3=k,g-3=d
    • 空格不变;C+3=F,h-3=e,e-3=b,n-3=k,g-3=d
    • 空格不变;2023 是非字母字符,不变

    结果就是 Wlkd Febkd 2023,和样例一致。

    参考代码

    #include <iostream>
    using namespace std;
    // 用途:字符加密术——大写字母ASCII码+n,小写字母ASCII码-n,其他字符不变
    int main() {
        string s;
        int n;
        getline(cin, s);   // 第一行的字符串可能含空格,用 getline 读整行
        cin >> n;          // 第二行是加密的偏移量 n
        for (int i = 0; i < s.size(); i++) {
            if (s[i] >= 'A' && s[i] <= 'Z')      // 大写字母:ASCII码加 n
                s[i] += n;
            else if (s[i] >= 'a' && s[i] <= 'z') // 小写字母:ASCII码减 n
                s[i] -= n;
            // 其他非字母字符保持不变,无需处理
        }
        cout << s << endl;
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:字符串长度不超过 500,每个字符只处理一次,所以是 O(n),其中 n 是字符串长度。
    • 空间复杂度:用一个字符串存输入,是 O(n)。

    这个加密过程非常快,500 个字符瞬间处理完。

    • 1