题解
信奥星球的密码
1 条题解
-
0
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