1

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

​欢迎大家订阅我的专栏:算法题解:C++与Python实现
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!

专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。

适合人群:

  • 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
  • 希望系统学习C++/Python编程的初学者
  • 想要提升算法与编程能力的编程爱好者

附上汇总帖:GESP认证C++编程真题解析 | 汇总


编程题

B3865 小杨的 X 字矩阵

【题目来源】

洛谷:[B3865 GESP202309 二级] 小杨的 X 字矩阵 - 洛谷

【题目描述】

小杨想要构造一个 的 X 字矩阵( 为奇数),这个矩阵的两条对角线都是半角加号 + ,其余都是半角减号 - 。例如,一个 \(5 \times 5\) 的 X 字矩阵如下:

+---+
-+-+-
--+--
-+-+-
+---+

请你帮小杨根据给定的 打印出对应的“X 字矩阵”。

【输入】

一行一个整数 ( \(5 \le N \le 49\),保证为奇数)。

【输出】

输出对应的“X 字矩阵”。

请严格按格式要求输出,不要擅自添加任何空格、标点、空行等任何符号。你应该恰好输出 \(N\) 行,每行除了换行符外恰好包含 \(N\) 个字符,这些字符要么是 +,要么是 -

【输入样例】

5

【输出样例】

+---+
-+-+-
--+--
-+-+-
+---+

【算法标签】

《洛谷 B3865 小杨的X字矩阵》 #GESP# #2023#

【代码详解】

#include <bits/stdc++.h>
using namespace std;

const int N = 55;  // 最大矩阵大小
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 l = 1;  // 主对角线列索引(从左到右)
    int r = n;  // 副对角线列索引(从右到左)
    
    // 填充两条对角线
    for (int i = 1; i <= n; i++)  // 遍历每一行
    {
        a[i][l] = '+';  // 主对角线:行i,列l
        a[i][r] = '+';  // 副对角线:行i,列r
        
        l++;  // 主对角线列索引向右移动
        r--;  // 副对角线列索引向左移动
    }
    
    // 输出矩阵
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            cout << a[i][j];
        }
        cout << endl;  // 每行结束后换行
    }
    
    return 0;
}

【运行结果】

5
+---+
-+-+-
--+--
-+-+-
+---+

B3866 数字黑洞

【题目来源】

洛谷:[B3866 GESP202309 二级] 数字黑洞 - 洛谷

【题目描述】

给定一个三位数,要求各位不能相同。例如,\(352\) 是符合要求的,\(112\) 是不符合要求的。将这个三位数的三个数字重新排列,得到的最大的数,减去得到的最小的数,形成一个新的三位数。对这个新的三位数可以重复上述过程。神奇的是,最终一定会得到 \(495\)

试试看,重新排列 \(352\),得到的最大数为 \(532\),最小数为 \(235\),它们的差是 \(297\);变换 \(297\),得到 \(972-279=693\);变换 \(693\)\(963-369=594\);变换 \(594\)\(954-459=495\)。因此,经过 \(4\) 次变换得到了 \(495\)

现在,输入的三位数,你能通过编程得出,这个三位数经过多少次变换能够得到 \(495\) 吗?

【输入】

输入一行,包含一个符合要求的三位数 \(N\)

【输出】

输出一行,包含一个整数 \(C\),表示经过 \(C\) 次变换得到 \(495\)

【输入样例】

352

【输出样例】

4

【算法标签】

《洛谷 B3866 数字黑洞》 #GESP# #2023#

【代码详解】

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    int n;
    cin >> n;
    
    // 检查输入范围
    if (n < 100 || n > 999)
    {
        cout << "请输入三位数" << endl;
        return 0;
    }
    
    // 检查是否全相同
    int a = n/100, b = (n/10)%10, c = n%10;
    if (a == b && b == c)
    {
        cout << "数字全相同,不会收敛" << endl;
        return 0;
    }
    
    int steps = 0;
    while (n != 495)
    {
        // 分解数字
        int digits[3];
        digits[0] = n / 100;       // 百位
        digits[1] = (n / 10) % 10; // 十位
        digits[2] = n % 10;        // 个位
        
        // 升序排序得最小数
        sort(digits, digits + 3);
        int min_num = digits[0]*100 + digits[1]*10 + digits[2];
        
        // 降序排序得最大数
        sort(digits, digits + 3, greater<int>());
        int max_num = digits[0]*100 + digits[1]*10 + digits[2];
        
        // 计算差值
        n = max_num - min_num;
        steps++;
        
        // 安全限制,防止死循环
        if (steps > 100)
        {
            cout << "可能陷入循环" << endl;
            return 0;
        }
    }
    
    cout << steps << endl;
    return 0;
}

【运行结果】

352
4
posted @ 2026-01-18 21:56  热爱编程的通信人  阅读(1)  评论(0)    收藏  举报