2059 字
10 分钟
GESP 2026年C++一级编程题解析
2026/03/14
2026/06/28

202603-1 交朋友#

题目描述

Alice 班上共有 4 个小朋友,身高分别为 H1,H2,H3,H4H_1, H_2, H_3, H_4,其中 Alice 的身高为 H1H_1

Alice 想要和身高最接近她的人交朋友,如果有多个人符合条件,则 Alice 想和其中较矮的那一人做朋友,你能告诉她这个人的身高是多少吗?

输入格式

输入共 4 行,第 ii 行包含一个整数 HiH_i,表示班上小朋友的身高。

输出格式

输出 1 行,包含一个整数 hh,表示 Alice 想交的朋友的身高。

输入样例

150
165
135
133

输出样例

135

样例解释

样例 1 中,Alice 身高为 150,第 2、3 个小朋友与 Alice 身高差距为 15,同样最接近,Alice 选较矮的一个即第 3 个身高为 135 的小朋友交朋友。

数据范围

保证 100Hi199100 \le H_i \le 199HiH_i 互不相同。

代码解析

这道题是一道“打擂台”求最小值的题,不过加了一些难度,是需要让每个数字减掉一个数字的差值去打擂台,而且这个差值有可能小于0,如 165-150=15,135-150=(-15),所以我们需要用差值的绝对值去打擂台,若绝对值相等就拿数字本身去打擂台,如 135 和 165 我们选小的 135

#include <bits/stdc++.h>
using namespace std;
int main() {
int h1, ans = 1000;
cin >> h1;
for (int i = 1; i <= 3; i++) {
int hi;
cin >> hi;
int d1 = abs(hi-h1), d2 = abs(ans-h1);
if (d1 < d2)
ans = hi;
else if (d1 == d2 && hi < ans)
ans = hi;
}
cout << ans;
return 0;
}

如果还没有学过数学函数 abs() 的话,可以定义变量保存差值,判断是否 < 0,如:

int d1 = hi-h1;
if (d1 < 0) d1 = -d1;
int d2 = hi-h1;
if (d2 < 0) d2 = -d2;

202603-2 数字替换#

题目描述

Alice 不喜欢数字 4,但觉得数字 8 寓意好,她想把数中的 4 全都替换成 8,若数中不含 4 则无需修改,你能帮帮她吗?

输入格式

输入一行,包含一个整数 AA,表示替换前的数。

输出格式

输出一行,包含一个整数 BB,表示替换后的数。

输入样例 1

8459045

输出样例 1

8859085

输入样例 2

123

输出样例 2

123

数据范围

保证 0A1080 \le A \le 10^8

代码解析

如果已经学了字符串,那只需要输入字符串遍历即可,但是一级的考纲不包含字符串,所以最简单的方法就是:

使用字符,依次输入,如果是字符 4 就输出 8,唯一的难点是题目没有给出数字的位数,所以我们可以直接把 cin 作为循环条件(这个技巧是第一次出现,平时几乎很少见,在考场上可能想不到)。

#include <bits/stdc++.h>
using namespace std;
int main() {
char n;
while (cin >> n) {
if (n == '4') cout << 8;
else cout << n;
}
return 0;
}

第二种解法就是使用数位分离(剥离)的技巧,将每个数字单独提取出来,判断是否为 4,若为 4 则变成 8,再利用进制相关知识,重新组合成新的数字,输出即可。

#include <iostream>
using namespace std;
int main() {
int A;
cin >> A;
int B = 0, weight = 1; // 位权:1, 10, 100, ...
while (A > 0) {
int t = A % 10;
if (t == 4) t = 8;
A /= 10;
// 将处理后的数字乘以其位权,加到结果中
B += t * weight;
weight *= 10; // 更新位权
}
cout << B << endl;
return 0;
}

202606-1 去旅行#

题目描述

快暑假了,小杨同学正在计划出去旅行,前往目的地的方案多种多样,小杨同学想知道如何前往目的地最便宜。

小杨同学住在 AA 市,旅行目的地是 BB 市,小杨同学前往目的地有三种方案:

  1. AA 市直飞 BB 市;
  2. AA 市坐高铁到 CC 市,然后坐飞机到 BB 市;
  3. AA 市坐高铁到 CC 市,然后坐高铁到 BB 市。

请帮小杨同学求出最便宜的出行方案的价格。

输入格式

输入包含 44 行,每行一个正整数:

  • 11 行的正整数表示「从 AA 市直飞 BB 市」的价格;
  • 22 行的正整数表示「从 AA 市坐高铁到 CC 市」的价格;
  • 33 行的正整数表示「从 CC 市坐飞机到 BB 市」的价格;
  • 44 行的正整数表示「从 CC 市坐高铁到 BB 市」的价格。

输出格式

输出一个正整数,表示 33 种方式中,最便宜的出行方案的价格。

样例输入 1

999
105
699
588

样例输出 1

693

样例输入 2

9
3
8
7

样例输出 2

9

提示

【样例解释 1】

方案 11. 直飞价格为 999999

方案 22. 高铁转飞机价格为 105+699=804105 + 699 = 804

方案 33. 高铁的价格为 105+588=693105 + 588 = 693

因此最便宜的价格是 693693

【样例解释 2】

方案 11. 直飞价格为 99

方案 22. 高铁转飞机价格为 3+8=113 + 8 = 11

方案 33. 高铁的价格为 3+7=103 + 7 = 10

因此最便宜的价格是 99

【数据范围】

所有输入均为正整数,且不超过 1000010000

代码解析

这道题是一道简单的计算后进行大小比较的题目,只需要按照题目给出的方案计算出价格,然后找最小值就可以。

#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, c, d;
cin >> a >> b >> c >> d;
cout << min(a, min(b+c, b+d));
// cout << min({a, b+c, b+d});
return 0;
}

202606-2 交税#

题目描述

根据国家税收相关规定,劳务报酬需要按月预交个税,预交税率如下:

  1. 劳务报酬不超过 800800 的,不需要预交个税;
  2. 劳务报酬超过 800800 的,仅超过 800800 的部分按照 20%20\%(即 0.20.2)税率预交个税(不超过 800800 的部分不需要预交个税);

例如,月劳务报酬为 1000.01000.0,则按照规则 22 需要预交个税 (1000.0800.0)×20%=40.00(1000.0 - 800.0) \times 20\% = 40.00

现在给定小杨同学 1212 个月的月度劳务报酬,请帮小杨同学计算他这 1212 个月应预交个税的总和。

输入格式

输入 1212 行,每行一个浮点数,表示小杨同学 1212 个月中每个月的劳务报酬。

每个浮点数恰好有一位小数。

输出格式

输出 11 行,一个浮点数,保留两位小数,表示小杨同学 1212 个月应预交个税的总和。

样例输入 1

932.0
1634.3
1790.4
2172.9
378.1
283.4
2761.9
3583.5
10.1
2324.9
1111.6
3812.3

样例输出 1

2584.76

提示

【样例解释 1】

  1. 932.0932.0 符合规则 22,超过 800800 的部分为 132.0132.0,按照 20%20\% 预交为 132.0×20%=26.40132.0 \times 20\% = 26.40
  2. 1634.31634.3 符合规则 22,超过 800800 的部分为 834.3834.3,按照 20%20\% 预交为 834.3×20%=166.86834.3 \times 20\% = 166.86
  3. 1790.41790.4 符合规则 22,超过 800800 的部分为 990.4990.4,按照 20%20\% 预交为 990.4×20%=198.08990.4 \times 20\% = 198.08
  4. 2172.92172.9 符合规则 22,超过 800800 的部分为 1372.91372.9,按照 20%20\% 预交为 1372.9×20%=274.581372.9 \times 20\% = 274.58
  5. 378.1378.1 符合规则 11,不需要预交个税;
  6. 283.4283.4 符合规则 11,不需要预交个税;
  7. 2761.92761.9 符合规则 22,超过 800800 的部分为 1961.91961.9,按照 20%20\% 预交为 1961.9×20%=392.381961.9 \times 20\% = 392.38
  8. 3583.53583.5 符合规则 22,超过 800800 的部分为 2783.52783.5,按照 20%20\% 预交为 2783.5×20%=556.702783.5 \times 20\% = 556.70
  9. 10.110.1 符合规则 11,不需要预交个税;
  10. 2324.92324.9 符合规则 22,超过 800800 的部分为 1524.91524.9,按照 20%20\% 预交为 1524.9×20%=304.981524.9 \times 20\% = 304.98
  11. 1111.61111.6 符合规则 22,超过 800800 的部分为 311.6311.6,按照 20%20\% 预交为 311.6×20%=62.32311.6 \times 20\% = 62.32
  12. 3812.33812.3 符合规则 22,超过 800800 的部分为 3012.33012.3,按照 20%20\% 预交为 3012.3×20%=602.463012.3 \times 20\% = 602.46

总和为 2584.762584.76

【数据范围】

小杨同学每月劳务报酬收入均为正,且恰好有一位小数,且不超过 4000.04000.0

代码解析

这道题比较综合,需要在循环中判断输入的每个值是否符合条件,如果大于800,则需要计算个税并累加求和,最终记得保留两位小数。

#include <bits/stdc++.h>
using namespace std;
int main() {
double sum = 0;
double x;
for (int i = 1; i <= 12; i++) {
cin >> x;
if (x > 800)
sum += (x-800) * 0.2;
}
cout << fixed << setprecision(2) << sum;
return 0;
}
GESP 2026年C++一级编程题解析
https://yezi.press/posts/gesp/gesp-cpp1-2026/
作者
Yezi 叶子
发布于
2026/03/14
许可协议
CC BY-NC-SA 4.0