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()
{
    // 输入数字上限n
    cin >> n;
  
    // 处理特殊情况:n小于等于9时直接输出n
    if (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()
{
    // 输入图案的尺寸n
    cin >> 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
.#.
#.#
.#.
posted @ 2026-02-15 15:16  团爸讲算法  阅读(11)  评论(0)    收藏  举报