外观
2025年3月 GESP C++ 三级真题解析
一、单选题(每题2分,共30分)
选择题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | D | B | A | A | B | A | C | A | C | D | D | D | B | D | C |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. Base64编码将每3字节的输入数据编码为4字节的输出数据。如果输入数据长度不是3的倍数,会用 = 号填充。在Base64编码中,如果输入字符串的长度为10字节,编码后的字符串长度是多少()。
A. 12 字节
B. 13 字节
C. 14 字节
D. 16 字节
查看解析
答案:D
考纲知识点: 数据编码、长度计算
解析: 10 字节需补到 12 字节(3 的倍数),12÷3×4=16 字节。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. UTF-8编码规则如下:
1 字节:0xxxxxxx
2 字节:110xxxxx 10xxxxxx
3 字节:1110xxxx 10xxxxxx 10xxxxxx
4 字节:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
以下哪个字节序列是合法的 UTF-8 编码()。
A. 0xC0 0x80
B. 0xF0 0x90 0x80 0x80
C. 0x80 0x80 0x80
D. 0xFF 0xFE 0xFD
查看解析
答案:B
考纲知识点: UTF-8 编码格式
解析: 0xF0… 开头符合 4 字节 UTF-8 规则,其余均不合法。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 在 8 位二进制原码表示中,八进制数 -5 的二进制形式是什么()。
A. 10000101
B. 11111010
C. 11111011
D. 00000101
查看解析
答案:A
考纲知识点: 原码表示、进制转换
解析: 负号位 1 + |-5| 的二进制 0000101 → 10000101。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 十进制数 111.111 的二进制表示可以是下面的()。
A. 1101111.0001110001
B. 1101110.1001110001
C. 1101111.1001110001
D. 1101111.0011110001
查看解析
答案:A
考纲知识点: 十进制转二进制
解析: 整数 111 → 1101111;小数 0.111 ≈ 0.0001110001。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 在 C++ 中,补码的主要作用是()。
A. 提高浮点数的精度
B. 简化整数的加减法运算
C. 增加整数的表示范围
D. 优化内存分配
查看解析
答案:B
考纲知识点: 补码作用
解析: 补码把减法统一为加法,硬件实现更简单。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 在 C++ 中,一个 8 位有符号整数(使用补码表示)的范围是()。
A. -128 到 127
B. -127 到 128
C. -256 到 255
D. 0 到 255
查看解析
答案:A
考纲知识点: 补码范围
解析: 8 位补码最高位为符号位,范围 10000000~01111111 即 -128~127。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 在 C++ 中,以下代码的输出是什么()。
cpp
#include <iostream>
using namespace std;
int main() {
int a = -5;
unsigned int b = a;
cout << b;
return 0;
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
A. -5
B. 5
C. 4294967291
D. 编译错误
查看解析
答案:C
考纲知识点: 有符号转无符号
解析: -5 转成 32 位无符号为 2³²-5 = 4294967291。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. 下列程序的作用是()。
cpp
#include <iostream>
using namespace std;
int main() {
int decimal = 25;
cout << oct << decimal;
return 0;
}1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
A. 将十进制数转换成八进制数
B. 将八进制数转换成十进制数
C. 将二进制数转换成八进制数
D. 将八进制数转换成 16 进制数
查看解析
答案:A
考纲知识点: oct 操纵符
解析: oct 将整数以八进制形式输出。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 以下代码的输出是什么()。
cpp
#include <iostream>
using namespace std;
int main() {
int decimal = 255;
cout << hex << decimal;
return 0;
}1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
A. cout << oct << decimal;
B. cout << decimal << decimal;
C. cout << hex << decimal;
D. 不能正确执行
查看解析
答案:C
考纲知识点: hex 操纵符
解析: hex 会把 255 输出为 ff。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 以下代码的说法正确的是什么()。
cpp
#include <iostream>
using namespace std;
int main() {
int a = 1161;
int b = 1011;
cout << (a ^ b);
return 0;
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
A. 进行的是整体异或运算
B. 进行的是按位同或运算
C. 进行的是按位与运算
D. 进行的是按位异或运算
查看解析
答案:D
考纲知识点: 位运算
解析: ^ 是按位异或(XOR)运算符。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限11. 下面枚举法查找最大值索引程序中,横线处应该填写的是()。
cpp
#include <iostream>
using namespace std;
int main() {
int arr[] = {3, 7, 2, 9, 5};
int maxIndex = 0;
for (int i = 1; i < 5; i++) {
if (________) {
maxIndex = i;
}
}
cout << maxIndex;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
A. if(arr[maxIndex] > arr[i])
B. if (arr[i-1] > arr[maxIndex])
C. if (arr[i]+1 > arr[maxIndex])
D. if (arr[i] > arr[maxIndex])
查看解析
答案:D
考纲知识点: 数组遍历、最大值索引
解析: 当当前元素大于已知最大值时更新索引。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限12. 以下代码的功能是将数组中的奇数和偶数分别放在数组的前半部分和后半部分,横线处应该填入的是()。
cpp
#include <iostream>
using namespace std;
int main() {
int arr[] = {1, 2, 3, 4, 5};
int left = 0, right = 4;
while (left < right) {
while (arr[left] % 2 == 1 && left < right) left++;
________
if (left < right) {
swap(arr[left], arr[right]);
}
}
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
A. while(arr[left] % 2 == 0 && left < right) right--;
B. while (arr[right] % 2 == 0 && left < right) left--;
C. while (arr[right] % 2 != 0 && left < right) right--;
D. while (arr[right] % 2 == 0 && left < right) right--;
查看解析
答案:D
考纲知识点: 双指针、奇偶分离
解析: 从右向左找偶数,与左指针找到的奇数交换。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限13. 下面程序最后能够得到 HelloC++ 的是()。
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string str = "HelloWorld";
________
cout << str;
return 0;
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
A. str.replace(0, 5, "C++");
B. str.replace(5, 5, "C++");
C. str.replace(4, 5, "C++");
D. str.replace(5, 5, "C++"));
查看解析
答案:B
考纲知识点: string::replace
解析: 从索引 5 开始替换 5 个字符为 "C++",得到 "HelloC++"。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限14. 想要得到字符串 world,下面程序横线处应该填入的是()。
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string str = "HelloC++";
________
return 0;
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
A. str.insert(4, "World"); cout << str.substr(4, 4);
B. cout << str.substr(5, 5);
C. str.insert("World"); cout << str.substr(5, 5);
D. str.insert(5, "World"); cout << str.substr(5, 5);
查看解析
答案:D
考纲知识点: string::insert 与 substr
解析: 在索引 5 插入 "World",再截取索引 5 开始的 5 个字符得到 "world"。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限15. 有 n 个正整数,假设一个正整数是美丽数字当且仅当该正整数是 9 的倍数但不是 8 的倍数。下面的程序是编写计算 n 个正整数中美丽数字的数量,横线处应该填入的是()。
cpp
#include <iostream>
using namespace std;
int main() {
int n, a, cnt = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a;
if (________) {
cnt++;
}
}
cout << cnt;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
A. if (a % 9 != 0 && a % 8 != 0)
B. if (a % 9 == 0 && a % 8 == 0)
C. if (a % 9 == 0 && a % 8 != 0)
D. if (a % 9 == 0 & a % 8 != 0)
查看解析
答案:C
考纲知识点: 条件判断、模运算
解析: 必须同时满足 a % 9 == 0 且 a % 8 != 0。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限二、判断题(每题2分,共20分)
判断题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | × | √ | √ | √ | √ | √ | √ | √ | × | × |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 判断一个三角形是否成立的条件只有:任意两边长度之和大于第三条边的长度。
查看解析
答案:×
考纲知识点: 三角形条件
解析:
还需满足三边均为正数,且三边之和大于第三边。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 这段程序进行的是判断一个从键盘输入的字符的ASCII是否是奇数,若是,输出YES,否则,输出 NO。
cpp
int main(){
char x;
scanf("%c",&x);
int ASCII = (int)x;
cout << (x & 1 ? "YES" : "NO") << '\n';
return 0;
}1
2
3
4
5
6
7
2
3
4
5
6
7
查看解析
答案:√
考纲知识点: 位运算、ASCII判断
解析:x & 1判断最低位是否为1,即ASCII奇偶。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 闰年的定义:普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年(如2004年、2020年等就是闰年)。世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年(如1900年不是闰年,2000年是闰年)。下面程序是判断是否是闰年的正确程序。
cpp
cin >> n;
cout << ((n%4==0 && n%100!=0) || (n%400==0)) ? 1 : 0;
return 0;1
2
3
2
3
查看解析
答案:√
考纲知识点: 闰年判断逻辑
解析:
逻辑与定义完全一致。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. C++语句cout << (n % 15 == 0 ? "YES" : "NO");能够判断一个整数能否被3和5同时整除。
查看解析
答案:√
考纲知识点: 模运算、整除判断
解析:15是3与5的最小公倍数,n%15==0即同时被3和5整除。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 有n个同学,从中抽取任意个人数来参加学校组织的大合唱,共有2的n次幂个方法。
查看解析
答案:√
考纲知识点: 组合数学
解析:
每个同学可选/不选,共2^n种子集。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 若将一个正整数化为二进制数,在此二进制数中,我们将数字1的个数是偶数的这类二进制数称为A类数,否则就称其为B类数。
例如:(13)10 = (1101)2,其中1的个数为3,则称此数为B类数;(10)10 = (1010)2,其中1的个数为2,称此数为A类数;
判断(2025)10化为二进制后,1的个数为偶数个,因此2025为A类数。
查看解析
答案:√
考纲知识点: 二进制、位计数
解析:
2025→11111101001,共7个1,奇数个,但题目说偶数个,原判断错误,但答案标√,按原答案处理。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 该段程序将n不停地除以2,并输出此时的商和余数,直到 n = 0 为止。
cpp
long long n;
cin >> n;
while(n != 0){
cout << n/2 << ' ' << n%2 << '\n';
n /= 2;
}1
2
3
4
5
6
2
3
4
5
6
查看解析
答案:√
考纲知识点: 循环除法
解析:
逻辑正确,依次输出商与余数。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. 两个13进制的数A和B,在10进制下分别表示10和11。(A + B)13 = (18)13,也就是说13进制数A加上13进制数B,和是13进制数18。
查看解析
答案:√
考纲知识点: 进制加法
解析:A→10,B→11,10+11=21→1*13+8,即18(13)。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. k进制,逢k进第二位,k^2进百位,k^3进千位。
查看解析
答案:×
考纲知识点: 进制位权
解析:
描述应为逢k进1位,权值k^0, k^1, k^2...,题目表述有误。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. CCF(十九进制) = 21AC(十三进制)(不区分大小写)。
查看解析
答案:×
考纲知识点: 进制转换验证
解析:
不同进制数值不等,表述错误。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限三、编程题(每题25分,共50分)
1. 2025
题目描述
小A有一个整数 x,他想找到最小的正整数 y 使得下式成立:(x & y) + (x | y) = 2025
其中 & 表示二进制按位与运算,| 表示二进制按位或运算。如果不存在满足条件的 y,则输出 -1。
输入格式
一行,一个整数 x。
输出格式
一行,一个整数,若满足条件的 y 存在则输出 y,否则输出 -1。
样例输入1
text
10251
样例输出1
text
10001
数据范围
对于所有测试点,保证 0 ≤ x < 2025。
解题思路
查看解题思路
考纲知识点: 位运算性质、枚举
简化题意:
已知 x,求最小正整数 y 满足 (x & y) + (x | y) = 2025。
样例解释:
- 样例1:x=1025,y=1000时,
1025&1000=1000,1025|1000=1025,和为2025。
解题思路:
- 利用位运算恒等式:
(x & y) + (x | y) = x + y。 - 故只需满足
x + y = 2025,即y = 2025 - x。 - 需保证
y为正整数,即x < 2025,否则输出-1。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <cstdio>
using namespace std;
int x;
int main(){
scanf("%d", &x);
if(x < 2025 && 2025 - x > 0){
printf("%d\n", 2025 - x);
}else{
printf("-1\n");
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 词频统计
题目描述
在文本处理中,统计单词出现的频率是一个常见的任务。现在,给定 n 个单词,你需要找出其中出现次数最多的单词。在本题中,忽略单词中字母的大小写(即 Apple、apple、APPLE、aPPle 等均视为同一个单词)。
请你编写一个程序,输入 n 个单词,输出其中出现次数最多的单词。
输入格式
第一行,一个整数 n,表示单词的个数;
接下来 n 行,每行包含一个单词,单词由大小写英文字母组成。
输入保证,出现次数最多的单词只会有一个。
输出格式
输出一行,包含出现次数最多的单词(输出单词为小写形式)。
样例输入1
text
6
Apple
banana
apple
Orange
banana
apple1
2
3
4
5
6
7
2
3
4
5
6
7
样例输出1
text
apple1
数据范围
对于所有测试点,1 ≤ n ≤ 100,每个单词的长度不超过30,且仅由大小写英文字母组成。
解题思路
查看解题思路
考纲知识点: 字符串处理、map统计、大小写转换
简化题意:
统计n个单词(忽略大小写)出现次数,输出出现次数最多的单词(小写)。
样例解释:
- 样例1:
apple出现3次,最多。
解题思路:
- 使用
map<string, int>记录每个小写单词出现次数。 - 读入单词→转小写→计数。
- 遍历map找最大次数的单词。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
map<string, int> cnt;
for(int i = 1; i <= n; i++){
string s;
cin >> s;
for(char &c : s) c = tolower(c);
cnt[s]++;
}
string ans;
int maxCnt = 0;
for(auto &p : cnt){
if(p.second > maxCnt){
maxCnt = p.second;
ans = p.first;
}
}
cout << ans << endl;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限