1243 字
6 分钟
GESP 2026年C++二级编程题解析
2026/03/14
2026/06/28

202603-1 数数#

题目描述

给定一个数,如果数中恰好存在3个2,则被称为美丽的数字。

现给定两个数 a,ba, b,其中 (a<ba < b),请输出它们之间(含端点)存在多少个美丽的数。

输入格式

输入一行两个整数 a,ba, b

输出格式

输出一个整数,表示 aabb 之间美丽的数有多少个。

样例输入

2221 2223

样例输出

2

数据范围

0a,b1060 \le a, b \le 10^6

代码解析

这道题是一道典型的数位剥离问题,我们可以用一个循环去遍历 aabb 之间的所有数,对于每个数,我们用一个循环去遍历它的每一位,统计其中 2 的个数,若个数为 3 则答案加一,注意不要直接用 i 去剥离,循环结束后 i 变成 0,导致死循环。

#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, ans = 0;
cin >> a >> b;
for (int i = a; i <= b; i++) {
int cnt = 0;
int j = i;
while (j != 0) {
if (j % 10 == 2) cnt++;
j /= 10;
}
if (cnt == 3) ans++;
}
cout << ans;
return 0;
}

202603-2 画画#

题目描述

给你一个单整数 nn,请输出一个 nnnn 列的方阵。方阵的四个顶点是 +,第一行和第 nn 行的非顶点位置是 -,第 1 列和第 nn 列非顶点位置是 |,中间位置是 *

输入格式

输入一个单整数 nn

输出格式

nnnn 列的方阵。

样例输入

5

样例输出

+---+
|***|
|***|
|***|
+---+

数据范围

n108n \le 10^8

代码解析

一道二级常考的画图问题,注意观察矩形中各种符号的规律即可,第一行和最后一行是 +-,其他行是 |*,分开处理即可。

#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
if (i == 1 || i == n) {
if (j == 1 || j == n) cout << '+';
else cout << '-';
} else {
if (j == 1 || j == n) cout << '|';
else cout << '*';
}
cout << endl;
}
return 0;
}

202606-1 完全平方数计数#

题目描述

小杨同学正在研究完全平方数。

平方: 一个数的平方等于这个数乘以这个数本身。

完全平方数: 指可以恰好表示为某个正整数的平方的数。

例如,99 是完全平方数,因为 9=32=3×39 = 3^2 = 3 \times 3;但 2727 不是,因为 2727 不能表示为任何正整数的平方。

给定两个正整数 llrr(保证 lrl \le r),小杨同学想知道 llrr 之间的所有正整数中(包含 llrr),有多少个数是完全平方数。

输入格式

输入两行,第一行为一个正整数 ll,第二行为一个正整数 rr

输出格式

输出一个非负整数,表示 llrr 中,有多少个正整数是完全平方数。如果 llrr 中没有完全平方数,则输出 00

样例输入 1

1
21

样例输出 1

4

提示

【样例解释 1】

112121 中,有以下 44 个整数是完全平方数: 1,4,9,161, 4, 9, 16

【数据范围】

1lr20001 \le l \le r \le 2000

代码解析

这道题和之前考过的题目类似,只需要利用 C++ 整数的特性,先求出 i 的平方根,保存到整数变量,再去求平方看是否等于 i 即可。

#include <bits/stdc++.h>
using namespace std;
int main() {
int l, r, cnt = 0;
cin >> l >> r;
for (int i = l; i <= r; i++) {
int a = sqrt(i);
if (a * a == i)
cnt++;
}
cout << cnt;
return 0;
}

202606-2 菱形#

题目描述

给定正整数 nn,在 (2n1)×(2n1)(2n - 1) \times (2n - 1) 个网格的画布中,使用字符画一个边长为 nn 个网格的菱形。其中,空白网格使用 \cdot 表示,菱形边所在的网格用 ++ 表示。

例如当 n=3n = 3 时,图形如下:

..+..
.+.+.
+...+
.+.+.
..+..

输入格式

输入一个正整数 nn

输出格式

输出 2n12n - 1 行,表示按要求画的菱形。

样例输入 1

4

样例输出 1

...+...
..+.+..
.+...+.
+.....+
.+...+.
..+.+..
...+...

提示

【数据范围】

3n153 \le n \le 15

代码解析

这道题和 2025 年 9 月菱形唯一不同的点,就是输入的 n 代表的含义不同,只需要注意这一点就可以,方法有很多种,这里给出一种上下两部分分开输出的方法。

#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
int m = 2*n-1;
// 先画上半部分
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++)
if (j == n + (i-1) || j == n - (i-1))
cout << '+';
else
cout << '.';
cout << endl;
}
// 下半部分 i 逆序即可,内层不变
for (int i = n-1; i >=1; i--) {
for (int j = 1; j <= m; j++)
if (j == n + (i-1) || j == n - (i-1))
cout << '+';
else
cout << '.';
cout << endl;
}
return 0;
}
GESP 2026年C++二级编程题解析
https://yezi.press/posts/gesp/gesp-cpp2-2026/
作者
Yezi 叶子
发布于
2026/03/14
许可协议
CC BY-NC-SA 4.0