【GESP】C++三级真题 luogu-B4067 [GESP202412 三级] 打印数字
GESP三级真题,字符串相关题目,难度★★☆☆☆。
luogu-B4067 [GESP202412 三级] 打印数字
题目要求
题目描述
小杨为数字 $0,1,2$ 和 $3$ 设计了一款表示形式,每个数字占用了 $5\times 5$ 的网格。数字 $0,1,2$ 和 $3$ 的表示形式如下:
..... ****. ..... ..... .***. ****. ****. ****. .***. ****. ..... ..... .***. ****. .**** ****. ..... ****. ..... .....
小杨想请你将给定的数字 $n$ 转换为对应的表示形式。
输入格式
第一行包含一个正整数代表 $n$。
输出格式
输出对应的表示形式。
输入输出样例 #1
输入 #1
1
12230
输出 #1
****.....................
****.****.****.****..***.
****.................***.
****..****.********..***.
****.....................
说明/提示
对于全部数据,保证有 $0\le n\le 10^6$,且 $n$ 仅由数字 $0,1,2,3$ 组成。
题目分析
解题思路
本题的解题思路如下:
- 输入处理:
- 读取一个数字n作为输入
- 将数字转换为字符串,方便逐位处理
- 核心逻辑:
- 预定义0-3这4个数字在5×5网格中的显示样式
- 按行处理输出:
- 对于每一行,遍历输入数字的每一位
- 根据当前数字和当前行号,输出对应的显示样式
- 每行处理完成后换行
- 输出格式:
- 每个数字占用5×5的网格空间
- 数字之间没有间隔
- 共输出5行
复杂度分析:
- 时间复杂度:$O(L)$,其中L为输入数字的位数
- 空间复杂度:$O(1)$,只需要存储固定大小的显示样式数组
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <string>
int main() {
// 定义5个数组存储0-3这4个数字在5x5网格中每一行的显示样式
std::string line_one[] = {".....", "****.", ".....", "....."};
std::string line_two[] = {".***.", "****.", "****.", "****."};
std::string line_three[] = {".***.", "****.", ".....", "....."};
std::string line_four[] = {".***.", "****.", ".****", "****."};
std::string line_five[] = {".....", "****.", ".....", "....."};
// 读入输入的数字
int n;
std::cin >> n;
// 将数字转换为字符串,方便逐位处理
std::string n_str = std::to_string(n);
// 按行输出每个数字的显示样式
// 第一行
for (int i = 0; i < n_str.size(); i++) {
int cur_num = n_str[i] - '0'; // 将字符转换为对应的数字
std::cout << line_one[cur_num];
}
std::cout << std::endl;
// 第二行
for (int i = 0; i < n_str.size(); i++) {
int cur_num = n_str[i] - '0';
std::cout << line_two[cur_num];
}
std::cout << std::endl;
// 第三行
for (int i = 0; i < n_str.size(); i++) {
int cur_num = n_str[i] - '0';
std::cout << line_three[cur_num];
}
std::cout << std::endl;
// 第四行
for (int i = 0; i < n_str.size(); i++) {
int cur_num = n_str[i] - '0';
std::cout << line_four[cur_num];
}
std::cout << std::endl;
// 第五行
for (int i = 0; i < n_str.size(); i++) {
int cur_num = n_str[i] - '0';
std::cout << line_five[cur_num];
}
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页
“luogu-”系列题目已加入洛谷Java、C++初学团队,作业清单,可在线评测,团队名额有限,欢迎加入。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
本文由作者按照 CC BY 4.0 进行授权