top1编程
← 返回题目
题解

信奥星球的密码

1 条题解

  • 0
    @ 2026-8-5 21:17:14

    P4267 信奥星球的密码(基础)

    解题思路

    密码规则:5 个数字字符排成一圈,每相邻两个(首尾也算相邻)的 ASCII 码相加,就得到一个新的字符。

    ASCII 码里数字字符是连续的:'0' 是 48,'1' 是 49……'9' 是 57。两个数字字符的 ASCII 码相加会得到 90~110 左右的数字,正好落在小写字母('a' 是 97)附近,所以样例 19875 能输出 jqolf。

    实现的关键是"首尾相连":第 5 个字符要和第 1 个字符配对。用取余运算: 下标 j = (i + 1) % 5 当 i=0、1、2、3 时,j 是 1、2、3、4;当 i=4 时,j = 5 % 5 = 0,正好绕回第 1 个字符。

    以样例 19875 为例('1'=49、'9'=57、'8'=56、'7'=55、'5'=53):

    • 49+57=106 → 'j'
    • 57+56=113 → 'q'
    • 56+55=111 → 'o'
    • 55+53=108 → 'l'
    • 53+49=102 → 'f' 输出 jqolf,和样例一致。

    边界情况:输入保证 5 个都是数字字符,相加结果一定落在可打印字符范围内;就算 0~9 任意组合也不会越界。字符数组 s[6] 多开一位是为了放结尾的 '\0'。

    参考代码

    // 用途:5个数字字符相邻相加(首尾也配对)生成5个密码字符
    #include <iostream>
    using namespace std;
    
    int main() {
        char s[6];
        cin >> s;                       // 读入5个数字字符
        for (int i = 0; i < 5; i++) {
            int j = (i + 1) % 5;        // 下一个字符的下标,第5个回到第1个
            cout << char(s[i] + s[j]);  // 两个ASCII码相加得到密码字符
        }
        return 0;
    }
    

    复杂度分析

    循环固定执行 5 次,每次做一次取余、一次加法和一次输出,时间复杂度 O(1),额外空间是一个长度为 6 的字符数组,O(1)。不管输入哪 5 个数字,运算次数都一样,因为长度固定是 5,用常数级别的描述就够了。

    • 1