GESP认证C++编程真题解析 | 202509 二级

编程题

B4411 优美的数字

【题目来源】

洛谷:B4411 [GESP202509 二级] 优美的数字 - 洛谷

【题目描述】

如果一个正整数在十进制下的所有数位都相同,小 A 就会觉得这个正整数很优美。例如,正整数 \(6\) 的数位都是 \(6\),所以 \(6\) 是优美的。正整数 \(99\) 的数位都是 \(9\),所以 \(99\) 是优美的。正整数 \(123\) 的数位不都相同,所以 \(123\) 并不优美。

小 A 想知道不超过 \(n\) 的正整数中有多少优美的数字。你能帮他数一数吗?

【输入】

一行,一个正整数 \(n\)

【输出】

一行,一个正整数,表示不超过 \(n\) 的优美正整数的数量。

【输入样例】

6

【输出样例】

6

【算法标签】

《洛谷 B4411 优美的数字》 #循环结构# #GESP# #2025#

【代码详解】

#include <bits/stdc++.h>
using namespace std;int n;      // 输入的数字上限
int cnt;    // 计数器,统计符合条件的数字个数/*** 检查数字是否所有位都相同* @param x 要检查的数字* @return 如果所有位相同返回true,否则返回false*/
bool check(int x)
{int tmp = x % 10;  // 获取最后一位数字x /= 10;           // 去掉最后一位// 检查剩余位是否都与最后一位相同while (x > 0){if (tmp != x % 10)  // 如果当前位不等于最后一位return false;x /= 10;            // 去掉当前位}return true;  // 所有位都相同
}int main()
{// 输入数字上限ncin >> n;// 处理特殊情况:n小于等于9时直接输出nif (n <= 9){cout << n << endl;return 0;}// 遍历1到n的所有数字for (int i = 1; i <= n; i++){// 检查当前数字是否所有位都相同if (check(i)){cnt++;  // 如果满足条件,计数器加1}}// 输出满足条件的数字个数cout << cnt << endl;return 0;
}

【运行结果】

6
6

B4412 菱形

【题目来源】

洛谷:B4412 [GESP202509 二级] 菱形 - 洛谷

【题目描述】

小 A 想绘制一个菱形。具体来说,需要绘制的菱形是一个 \(n\)\(n\) 列的字符画,\(n\) 是一个大于 \(1\) 的奇数。菱形的四个顶点依次位于第 \(1\) 行、第 \(1\) 列、第 \(n\) 行、第 \(n\) 列的正中间,使用 # 绘制。相邻顶点之间也用 # 连接。其余位置都是 .

例如,一个 \(5\)\(5\) 列的菱形字符画是这样的:

..#..
.#.#.
#...#
.#.#.
..#..

给定 \(n\),请你帮小 A 绘制对应的菱形。

【输入】

一行,一个正整数 \(n\)

【输出】

输出共 \(n\) 行,表示对应的菱形。

【输入样例】

3

【输出样例】

.#.
#.#
.#.

【算法标签】

《洛谷 B4412 菱形》 #循环结构# #GESP# #2025#

【代码详解】

#include <bits/stdc++.h>
using namespace std;const int N = 35;  // 定义二维数组的最大尺寸
int n;              // 存储输入的图案尺寸
char a[N][N];       // 二维字符数组,用于存储图案int main()
{// 输入图案的尺寸ncin >> n;// 初始化整个图案为全'.'for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){a[i][j] = '.';}}// 绘制图案上半部分的'#'(从顶部到中间)int t = n / 2 + 1;  // 中间列的位置for (int i = 1; i <= n / 2 + 1; i++){a[i][t] = '#';                  // 在当前行的中间列位置放置'#'a[i][(n / 2 + 1) * 2 - t] = '#'; // 对称位置放置'#'t--;                            // 向两侧扩展}// 绘制图案下半部分的'#'(从中间到底部)t = 1;  // 从第一列开始for (int i = (n / 2 + 1); i <= n; i++){a[i][t] = '#';                  // 在当前行的两侧位置放置'#'a[i][(n / 2 + 1) * 2 - t] = '#'; // 对称位置放置'#'t++;                            // 向中间收缩}// 输出最终图案for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){cout << a[i][j];}cout << endl;  // 每行输出后换行}return 0;
}

【运行结果】

3
.#.
#.#
.#.