文章

【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$ 组成。


题目分析

解题思路

本题的解题思路如下:

  1. 输入处理:
    • 读取一个数字n作为输入
    • 将数字转换为字符串,方便逐位处理
  2. 核心逻辑:
    • 预定义0-3这4个数字在5×5网格中的显示样式
    • 按行处理输出:
      • 对于每一行,遍历输入数字的每一位
      • 根据当前数字和当前行号,输出对应的显示样式
    • 每行处理完成后换行
  3. 输出格式:
    • 每个数字占用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 进行授权