1658 字
8 分钟
GESP 2026年C++五级编程题解析
2026/03/14
2026/06/28

202603-1 有限不循环小数#

题目描述

1a\frac{1}{a} 可化为一个有限的,不循环的小数,则称 aa终止数

请你求出在 LLRR 中终止数的数量。

输入格式

输入一行,包含两个整数 L,RL,R

输出格式

输出一行,包含一个整数,表示 LLRR 中终止数的数量。

样例输入 1

2 11

样例输出 1

5

提示

【样例解释】

[2,11][2,11] 终止数有 224455881010

【数据范围】

保证 1LR1061 \le L \le R \le 10^6

代码解析

这道题代码很简单,考察的重点是数论,一个数字如果是终止数,那么它的质因子只能有 2255,通过题目给出的 2、4、5、8、10 花点时间思考也可以找到这个规律,所有我们只需要判断每个数字是否只包含 2255 这两个质因子即可。

#include <bits/stdc++.h>
using namespace std;
bool check(int a) {
while (a % 2 == 0) a /= 2;
while (a % 5 == 0) a /= 5;
if (a == 1) return true;
return false;
}
int main() {
int l, r, cnt = 0;
cin >> l >> r;
for (int i = l; i <= r; i++)
if (check(i))
cnt++;
cout << cnt;
return 0;
}

202603-2 找数#

题目描述

给定一个包含 nn 个互不相同的正整数的数组 AA 与一个包含 mm 个互不相同的正整数的数组 BB,请你帮忙计算有多少个数在数组 AA 与数组 BB 中均出现。

输入格式

第一行包含两个整数 n,mn,m

第二行包含 nn 个正整数 a1,a2,,ana_1,a_2,\cdots,a_n 表示数组 AA

第三行包含 mm 个正整数 b1,b2,,bmb_1,b_2,\cdots,b_m 表示数组 BB

输出格式

输出一个整数,表示在数组 AA 与数组 BB 中均出现的数的个数。

样例输入 1

3 5
4 2 3
3 1 5 4 6

样例输出 1

2

提示

【样例解释】

样例 1 中,4433 在数组 AABB 中均出现。

【数据范围】

对于 40%40\% 的数据,保证 1n,m10001 \leq n,m \leq 1000

对于 100%100\% 的数据,保证 1n,m1051 \leq n,m \leq 10^51ai,bi1091 \leq a_i,b_i \leq 10^9

代码解析

这道题代码也很简单,我们先将数组 AA 排序,然后对于数组 BB 中的每个数 bb,我们使用二分查找在数组 AA 中查找是否存在 bb,如果存在,那么 bb 就是在数组 AA 与数组 BB 中均出现的数。

#include <bits/stdc++.h>
using namespace std;
int n, m, a[100005], cnt = 0;
// 二分查找
int search (int l, int r, int x) {
while (l != r) {
int mid = (l + r) / 2;
if (a[mid] >= x) r = mid;
else l = mid+1;
}
return l;
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++)
cin >> a[i];
sort(a, a+n);
int b;
for (int j = 0; j < m; j++){
cin >> b;
if (a[search(0, n, b)] == b)
cnt++;
}
cout << cnt;
return 0;
}

或者直接使用 STL 中的 lower_bound 函数来实现二分查找,代码如下:

#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m, a[100005], cnt = 0;
cin >> n >> m;
for (int i = 0; i < n; i++)
cin >> a[i];
sort(a, a+n);
int b;
for (int j = 0; j < m; j++){
cin >> b;
if (a[lower_bound(a, a+n, b)-a] == b)
cnt++;
}
cout << cnt;
return 0;
}

202606-1 排排坐#

题目描述

老师正在和小朋友们分糖果。

小朋友们先在自己的手上写一个数字,然后坐成一排。

老师分发糖果的规则是:每个小朋友获得自己以及左侧所有小朋友的手上数字之和个糖果。

现在小朋友们都已经在自己手上写上了数字。

请帮小朋友们安排合适的座位顺序,使得小朋友们分到的糖果总量最大,输出这个最大值。

输入格式

输入 22 行,

第一行为一个正整数 nn,表示小朋友的个数;

第二行为 nn 个正整数 a1,a2,,ana_1, a_2, \cdots, a_n,表示小朋友们手上的数字,整数之间以空格分隔。

输出格式

输出一个整数,表示小朋友们可能分到的最大糖果总数量。

样例输入 1

5
7 5 8 9 3

样例输出 1

111

提示

【样例解释】

小朋友安排座位后从左向右每人手上数字依次是:9,8,7,5,39, 8, 7, 5, 3

这时可以得到最多的糖果:(9)+(9+8)+(9+8+7)+(9+8+7+5)+(9+8+7+5+3)=111(9) + (9 + 8) + (9 + 8 + 7) + (9 + 8 + 7 + 5) + (9 + 8 + 7 + 5 + 3) = 111

【数据范围】

1n10001 \le n \le 10001ai10001 \le a_i \le 1000

代码解析

贪心算法,每个孩子的糖果为他左边的所有孩子手上的的数字和,要想让每个孩子获得的糖果数量最多,我们需要将越大的数字排在越前面的位置,只需要从大到小排序,再计算即可。

#include <bits/stdc++.h>
using namespace std;
int main() {
int a[1005], n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
sort(a, a+n, greater<int>());
int sum = 0, ans = 0;
for (int i = 0; i < n; i++) {
ans += a[i];
sum += ans;
}
cout << sum;
return 0;
}

202606-2 晚宴#

题目描述

小明去参加晚宴。晚宴中有 nn 个菜肴,每个菜肴都有一个美味度,第 ii 个菜肴的美味度为 viv_i

晚宴规定小明只能恰好选取两道菜肴,并且这两道菜肴的美味度必须要互质(即最大公约数为 11)。

请帮助小明选取两道菜肴,使得两道菜肴美味度之和最大。

输入格式

输入 22 行,

第一行为一个正整数 nn,表示菜肴的个数;

第二行为 nn 个整数 v1,v2,,vnv_1, v_2, \cdots, v_n 表示菜肴的美味度,整数之间以空格分隔。

输出格式

输出一个整数,表示两道互质菜肴美味度之和的最大值。

样例输入 1

5
3 5 7 35 105

样例输出 1

38

提示

【样例解释 1】

最优选择是 333535

注意到,105105 与其他任意菜肴的最大公约数都大于 11,因此无法参与合法选择。

【数据范围】

2n10002 \le n \le 1000, 1vi10000001 \le v_i \le 1000000

数据保证不存在相同美味度的菜肴。

数据保证至少存在一种选取两道菜肴的方案。

代码解析

互质数的判断使用辗转相除法,数据范围只有 10001000 ,直接暴力枚举即可。

#include <bits/stdc++.h>
using namespace std;
bool isp(int a, int b) {
while (a % b) {
int t = a % b;
a = b;
b = t;
}
return b == 1;
}
int main() {
int n, ans = 0, a[1005];
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 0; i < n; i++)
for (int j = i+1; j < n; j++)
if (isp(a[i], a[j]))
ans = max (ans , a[i]+a[j]);
cout << ans;
return 0;
}
GESP 2026年C++五级编程题解析
https://yezi.press/posts/gesp/gesp-cpp5-2026/
作者
Yezi 叶子
发布于
2026/03/14
许可协议
CC BY-NC-SA 4.0