1

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

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

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

适合人群:

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

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


编程题

B3863 买文具

【题目来源】

洛谷:[B3863 GESP202309 一级] 买文具 - 洛谷

【题目描述】

开学了,小明来到文具店选购文具。签字笔 \(2\) 元一支,他需要 \(X\) 支;记事本 \(5\) 元一本,他需要 \(Y\) 本;直尺 \(3\) 元一把,他需要 \(Z\) 把。小明手里有 \(Q\) 元钱。请你通过编程帮小明算算,他手里的钱是否够买他需要的文具。

【输入】

第一行包含一个正整数,是小明购买签字笔的数量。约定 \(1 \le X \le 10\)

第二行包含一个正整数,是小明购买记事本的数量。约定 \(1 \le Y \le 10\)

第三行包含一个正整数,是小明购买直尺的数量。约定 \(1 \le Z \le 10\)

第四行包含一个正整数 \(Q\),是小明手里的钱数(单位:元)。

【输出】

输出 \(2\) 行。如果小明手里的钱够买他需要的文具,则第一行输出 Yes,第二行输出小明会剩下的钱数(单位:元);否则,第一行输出 No,第二行输出小明缺少的钱数(单位:元)。

【输入样例】

1
1
1
20

【输出样例】

Yes
10

【算法标签】

《洛谷 B3863 买文具》 #分支结构# #GESP# #2023#

【代码详解】

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

int x, y, z;  // 三种物品的数量
int q;        // 预算金额

int main()
{
    // 输入三种物品的数量和预算
    cin >> x >> y >> z >> q;
    
    // 计算总花费
    int t = x * 2 + y * 5 + z * 3;
    
    // 判断预算是否足够
    if (t <= q)
    {
        // 预算足够
        cout << "Yes" << endl;      // 输出"Yes"表示可以购买
        cout << q - t << endl;      // 输出剩余金额
    }
    else
    {
        // 预算不足
        cout << "No" << endl;       // 输出"No"表示不能购买
        cout << t - q << endl;      // 输出还差多少金额
    }
    
    return 0;
}

【运行结果】

1
1
1
20
Yes
10

B3864 小明的幸运数

【题目来源】

洛谷:[B3864 GESP202309 一级] 小明的幸运数 - 洛谷

【题目描述】

所有个位数为 \(k\) 的正整数,以及所有 \(k\) 的倍数,都被小明称为“ \(k\) 幸运数”。小明想知道正整数 \(L\)\(R\) 之间(包括 \(L\)\(R\))所有 \(k\) 幸运数的和,你能帮帮他吗?

【输入】

输入 \(3\) 行。第一行包含一个正整数 \(k\),第二行包含一个正整数 \(L\),第三行包含一个正整数 \(R\)。约定 \(2 \le k \le 9\)\(1 \le L \le R \le 1000\)

【输出】

输出 \(1\) 行,符合题意的幸运数之和。

【输入样例】

7
1
10

【输出样例】

7

【算法标签】

《洛谷 B3864 小明的幸运数》 #循环结构# #GESP# #2023#

【代码详解】

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

int k;  // 特殊数字
int L, R;  // 区间[L, R]
int ans;  // 符合条件的数字之和

int main()
{
    // 输入特殊数字k和区间[L, R]
    cin >> k >> L >> R;
    
    // 遍历区间[L, R]中的每个整数
    for (int i = L; i <= R; i++)
    {
        // 判断数字i是否符合条件:
        // 条件1: i的个位数字等于k (i%10==k)
        // 条件2: i能被k整除 (i%k==0)
        if (i % 10 == k || i % k == 0)
        {
            ans += i;  // 如果符合条件,累加到ans
        }
    }
    
    // 输出符合条件的数字之和
    cout << ans << endl;
    
    return 0;
}

【运行结果】

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