202606-加密(luogu-B4555)
GESP C++三级,2026年6月真题,数组映射,难度⭐,洛谷难度入门。
luogu-B4555 [GESP202606 三级] 加密
题目要求
题目描述
小杨同学有一串数字,想把它们变成另一串数字,这个过程叫做加密。
他有一本密码本,密码本告诉你:每个数字应该变成哪个数字。
数字一共有 个:、、、、、、、、、。
密码本会依次告诉你: 要变成什么, 要变成什么,……, 要变成什么。
请你按照密码本,把原来的每个数字都换成新的数字,然后输出。
输入格式
输入共有 行。
第一行:一个整数,表示有多少个数字需要加密;
第二行:这些需要加密的数字;
第三行:密码本,一共 个数字。第 个数字表示 加密后变成什么,第 个数字表示 加密后变成什么,……,第 个数字表示 加密后变成什么。
输出格式
输出加密后的数字,即把输入第二行里的每个数字,都按照密码本替换后输出。
输入输出样例 #1
输入 #1
7
0 2 0 3 4 1 9
9 0 1 2 3 4 5 6 7 8输出 #1
9 1 9 2 3 0 8说明/提示
密码本 的含义为:,,,,,,,,,。
因此原数字 加密后为 。
数据范围
需要加密的数字个数不超过 个,且均为 到 ;密码本中的数字不重复,且均为 到 。
题目分析
解题思路
本题的解题思路如下:
问题本质:
- 给定一个长度为 的数组作为密码本,其中
map[i]表示数字 加密后对应的数字 - 对输入的每个数字,查表替换后输出
- 给定一个长度为 的数组作为密码本,其中
解题关键 — 数组下标映射:
- 用一个大小为 的数组
map[0..9]存储密码本 - 读入密码本后,
map[i]即为数字 加密后的结果 - 对于每个待加密的数字 ,直接输出
map[x]即可
- 用一个大小为 的数组
复杂度分析:
- 时间复杂度:,其中 为待加密的数字个数,每个数字只需一次数组查表
- 空间复杂度:,只需一个大小为 的数组
示例代码
利用数组下标天然对应数字 到 的特性,直接建立映射表并逐个替换输出。
#include <iostream>
int main() {
// 读入待加密的数字个数
int n;
std::cin >> n;
// 读入待加密的数字,存入数组
int a[20000];
for (int i = 0; i < n; i++) {
std::cin >> a[i];
}
// 读入密码本,map[i] 表示数字 i 加密后变成 map[i]
int map[10];
for (int i = 0; i < 10; i++) {
std::cin >> map[i];
}
// 逐个替换并输出
for (int i = 0; i < n; i++) {
// 通过数组下标直接查表得到加密后的数字
std::cout << map[a[i]];
// 数字之间用空格分隔
if (i < n - 1) {
std::cout << " ";
}
}
std::cout << std::endl;
return 0;
}本文由coderli.com原创,按照CC BY-NC-SA 4.0 进行授权
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
“luogu-”系列题目可在 洛谷题库 在线评测。
“bcqm-”系列题目可在 编程启蒙题库 在线评测。
GESP/CSP认证交流QQ群: 688906745
GESP/CSP 认证学习微信公众号

最后更新于