GESP 2025年03月认证 C++ 3级真题

1 单选题(每题 2 分,共 30 分)

题号123456789101112131415
答案DBAABACACDDBBCC

第 1 题 Base64 编码将每 3 字节的输入数据编码为 4 字节的输出数据。如果输入数据长度不是 3 的倍数,会用 = 号填充。在 Base64 编码中,如果输入字符串的长度为 10 字节,编码后的字符串长度是多少( )。

  • A. 12 字节
  • B. 13 字节
  • C. 14 字节
  • D. 16 字节

知识点解析:Base64 编码每 3 字节输入转为 4 字节输出,不足 3 字节时填充 =。输入 10 字节时,需填充 2 字节(凑成 12 字节输入),输出为 12÷3×4=1612÷3×4=16 字节。


第 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. 0xF0 0xF0 0xFD

知识点解析:选项 B 0xF0 0x90 0x80 0x80 符合 4 字节 UTF-8 编码规则(首字节 11110xxx,后续字节以 10xxxxxx 开头)。其他选项首字节或后续字节格式错误。


第 3 题 在 8 位二进制原码表示中,八进制数 -5 的二进制形式是什么( )。

  • A. 10000101
  • B. 11111010
  • C. 11111011
  • D. 00000101

知识点解析:原码表示中,最高位为符号位,其余为绝对值。-5 的绝对值为 0000101,符号位为 1,故二进制原码为 10000101


第 4 题 十进制数 111.111 的二进制表示可以是下面的( )。

  • A. 1101111.0001110001
  • B. 1101110.1001110001
  • C. 1101111.1001110001
  • D. 1101111.0011110001

知识点解析:111 的二进制为 1101111,0.111 的二进制需逐位计算,结果为 0001110001。选项 A 1101111.0001110001 正确。


第 5 题 在 C++ 中,补码的主要作用是( )。

  • A. 提高浮点数的精度
  • B. 简化整数的加减法运算
  • C. 增加整数的表示范围
  • D. 优化内存分配

知识点解析:补码统一了正负数的加减法运算,无需区分符号位,简化了硬件设计。


第 6 题 在 C++ 中,一个 8 位有符号整数(使用补码表示)的范围是( )。

  • A. -128 到 127
  • B. -127 到 128
  • C. -256 到 255
  • D. 0 到 255

知识点解析:8 位补码范围:最高位为符号位,数值范围为 −27−27 到 27−127−1,即 -128 到 127。


第 7 题 在 C++ 中,以下代码的输出是什么( )。

int a = -5;  
unsigned int b = a;  
cout << b;  
  • A. -5
  • B. 5
  • C. 4294967291
  • D. 编译错误

知识点解析:负数赋值给无符号整数时,按补码转换为大正数。-5 的补码为 11111011(8位),扩展为 32 位后对应无符号值为 4294967291。


第 8 题 下列程序的作用是( )。

int main() {  
    int decimal = 25;  
    cout << oct << decimal;  
    return 0;  
}  
  • A. 将十进制数转换成八进制数
  • B. 将八进制数转换成十进制数
  • C. 将二进制数转换成八进制数
  • D. 将八进制数转换成 16 进制数

知识点解析oct 是 C++ 的输出修饰符,将整数以八进制形式输出。


第 9 题 下面程序是将十进制数转换成六进制数:

#include <iostream>  
using namespace std;  

int main() {  
    int decimal = 255;  
    return 0;  
}  
  • A. cout << oct << decimal;
  • B. cout << decimal << decimal;
  • C. cout << hex << decimal;
  • D. 不能正确执行

知识点解析:C++ 标准库仅支持 oct(八进制)、dec(十进制)、hex(十六进制),无六进制输出功能,代码无法正确执行。


第 10 题 以下代码的说法正确的是什么( )。

#include <iostream>  
using namespace std;  

int main() {  
    int a = @b1101;  
    int b = @b1011;  
    cout << (a ~ b);  
    return 0;  
}  
  • A. 进行的是整体异或运算
  • B. 进行的是按位同或运算
  • C. 进行的是按位与运算
  • D. 进行的是按位异或运算

知识点解析:C++ 中按位异或运算符为 ^,但题目中 @b~ 语法错误。若假设 ab 为二进制数,异或运算结果为按位异或。


第 11 题 下面枚举法查找最大值索引程序中,横线处应该填写的是( )。

#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;  
}  
  • 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])

知识点解析:遍历数组时,若当前元素 arr[i] 大于已知最大值 arr[maxIndex],则更新最大值索引。


第 12 题 以下代码的功能是将数组中的奇数和偶数分别放在数组的前半部分和后半部分,横线处应该填入的是( )。

#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;  
}  
  • 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--;

知识点解析:需从右向左找到第一个偶数(arr[right] % 2 == 0),然后与左指针的奇数交换,实现奇偶分离。


第 13 题 下面程序最后能够得到 HelloC++ 的是( )。

int main() {  
    string str = "HelloWorld";  
    cout << str;  
    return 0;  
}  
  • A. str.replace(0, 5, "C++");
  • B. str.replace(5, 5, "C++");
  • C. str.replace(1, 5, "C++");
  • D. str.replace(4, 5, "C++");

知识点解析str.replace(5, 5, "C++") 表示从索引 5 开始替换 5 个字符为 “C++“,原字符串 “HelloWorld” 变为 “HelloC++”。


第 14 题 想要得到字符串 world,下面程序横线处应该填入的是( )。

#include <iostream>  
#include <string>  
using namespace std;  

int main() {  
    string str = "HelloC++";  
    ______  
    return 0;  
}  
  • 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);  

知识点解析str.substr(5, 5) 从索引 5 截取 5 个字符,原字符串 “HelloC++” 中索引 5 开始为 “C++“,但题目要求输出 “world”,选项可能存在题目描述冲突。


第 15 题 有 n 个正整数,假设一个正整数是美丽数字当且仅当该正整数是 9 的倍数但不是 8 的倍数。下面的程序是编写计算 n 个正整数中美丽数字的数量,横线处应该填入的是( )。

for (int i = 1; i <= n; i++) {  
    cin >> a;  
    ______  
    cnt++;  
}  
  • 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)

知识点解析:美丽数字需满足两个条件:是 9 的倍数(a % 9 == 0)且不是 8 的倍数(a % 8 != 0)。

2 判断题(每题 2 分,共 20 分)

题号12345678910
答案××

第 1 题 判断一个三角形是否成立的条件只有:任意两边长度之和大于第三条边的长度。( )

知识点解析:三角形成立的充要条件是任意两边之和大于第三边。


第 2 题 这段程序进行的是判断一个从键盘输入的字符的 ASCII 是否是奇数,若是,输出 YES,否则,输出 NO。( )

int main() {  
    char x;  
    scanf("%c", &x);  
    int ASCII = (int)x;  
    cout << (x & 1 ? "YES" : "NO") << '\n';  
    return 0;  
}  

知识点解析x & 1 检查最低位是否为 1,奇数的二进制最低位为 1。


第 3 题 闰年的定义:

  • 普通闰年:公历年份是 4 的倍数,且不是 100 的倍数的,为闰年(如 2004 年、2020 年等就是闰年)。
  • 世纪闰年:公历年份是整百数的,必须是 400 的倍数才是闰年(如 1900 年不是闰年,2000 年是闰年)。
    下面程序是判断是否是闰年的正确程序。( )
cin >> n;  
cout << ((n % 4 == 0 && n % 100 != 0) || (n % 400 == 0)) ? 1 : 0;  

知识点解析:代码逻辑 (n%4==0 && n%100!=0) || (n%400==0) 正确实现了闰年判断规则。


第 4 题 C++ 语句 cout << (n % 15 == 0 ? "YES" : "NO"); 能够判断一个整数能否被 3 和 5 同时整除。( )

知识点解析n % 15 == 0 等价于 n 能同时被 3 和 5 整除。


第 5 题 有 n 个同学,从中抽取任意个人数来参加学校组织的大合唱,共有2的n次幂个⽅法。( )

知识点解析:抽取任意人数的方法数共有2的n次幂个⽅法。


第 6 题 若将一个正整数化为二进制数,在此二进制数中,我们将数字 1 的个数是偶数的这类二进制数称为 A 类数,否则就称其为 B 类数。
例如:

  • (13) 10 = (1101) 2,其中 1 的个数为 3,称此数为 B 类数;

  • 10 10 = (1010) 2,其中 1 的个数为 2,称此数为 A 类数;

判断:2025 10 化为二进制后,1 的个数为偶数个,因此 2025 为 A 类数。( )

知识点解析:2025 的二进制为 11111100111,其中 1 的个数为 8(偶数),应为 A 类数。


第 7 题 该段程序将 n 不停地除以 2,并输出此时的商和余数,直到 n=0 为止。( )

long long n;  
cin >> n;  
while (n != 0) {  
    cout << n / 2 << ' ' << n % 2 << '\n';  
    n /= 2;  
}  

知识点解析:循环中 n 被更新为 n/2,输出的是 n/2n%2


第 8 题 两个 13 进制的数 A 和 B,在 10 进制下分别表示 10 和 11。(A + B) 13 = 18 13,也就是说 13 进制数 A 加上 13 进制数 B,和是 13 进制数 18。( )

知识点解析:13 进制中 A=10,B=11,A+B=21(十进制),转换为 13 进制为 1*13 + 8 = 21,即 18_{13}


第 9 题 k 进制,逢 k 进第二位,k_2逢百位,k_3逢千位。( )

知识点解析:k 进制逢 k 进一,第二位、第三位等是位置权值的概念,题目描述混淆了“进位”与“位权”。


第 10 题 CCF(十九进制)等于 21AC(十三进制)(不区分大小写)。( )

知识点解析:需将 CCF(十九进制)和 21AC(十三进制)分别转换为十进制验证是否相等。


3 编程题(每题 25 分,共 50 分)

3.1 编程题 1

  • 时间限制:1.0 s
  • 内存限制:512.0 MB

3.1.1 2025

3.1.2 题目描述

小 A 有一个整数 x,他想找到最小的正整数 y 使得下式成立:

(x and y)+(x or y)=2025(x and y)+(x or y)=2025

其中 and 表示二进制按位与运算,or 表示二进制按位或运算。如果不存在满足条件的 y,则输出 -1。

3.1.3 输入格式

一行,一个整数 x。

3.1.4 输出格式

一行,一个整数,若满足条件的 y 存在则输出 y,否则输出 -1。

3.1.5 样例

输入样例 1

1025  

输出样例 1

1000  

3.1.6 数据范围

对于所有测试点,保证 0≤x<20250≤x<2025。

3.1.7 参考程序

#include <stdio.h>  
using namespace std;  
int x;  
int main() {  
    scanf("%d", &x);  
    for (int i = 1; i <= 2025; i++)  
        if ((x & i) + (x | i) == 2025) {  
            printf("%d\n", i);  
            return 0;  
        }  
    printf("-1\n");  
    return 0;  
}  

知识点解析

利用位运算性质:x and y+x or y=x+yx and y+x or y=x+y。题目转化为求最小的 yy 使得 x+y=2025x+y=2025,即 y=2025−xy=2025−x。需验证 y>0y>0。 参考代码

#include <iostream>  
using namespace std;  
int main() {  
    int x;  
    cin >> x;  
    int y = 2025 - x;  
    cout << (y > 0 ? y : -1);  
    return 0;  
}  

核心:位运算的数学性质与简化问题。


3.2 编程题 2

  • 时间限制:1.0 s
  • 内存限制:512.0 MB

3.2.9 词频统计

3.2.10 题目描述

在文本处理中,统计单词出现的频率是一个常见的任务。现在,给定 n 个单词,你需要找出其中出现次数最多的单词。在本题中,忽略单词中字母的大小写(即 Apple、apple、APPLE、apple 等均视为同一个单词)。 请你编写一个程序,输入 n 个单词,输出其中出现次数最多的单词。

3.2.11 输入格式

第一行,一个整数 n,表示单词的个数; 接下来 n 行,每行包含一个单词,单词由大小写英文字母组成。 输入保证,出现次数最多的单词只会有一个。

3.2.12 输出格式

输出一行,包含出现次数最多的单词(输出单词为小写形式)。

3.2.13 样例

输入样例 1

6  
Apple  
banana  
apple  
Orange  
banana  
apple  

输出样例 1

apple  

3.2.14 数据范围

对于所有测试点,1≤n≤1001≤n≤100,每个单词的长度不超过 30,且仅由大小写英文字母组成。

3.2.15 参考程序

#include <bits/stdc++.h>  
using namespace std;  
int main() {  
    int n; cin >> n;  
    map<string, int> cnt;  
    int mx = -1;  
    for (int i = 1; i <= n; i++) {  
        string s; cin >> s;  
        transform(s.begin(), s.end(), s.begin(), ::tolower);  
        cnt[s]++;  
        mx = max(mx, cnt[s]);  
    }  
    for (auto it : cnt) {  
        if (it.second == mx) {  
            cout << it.first << '\n';  
            break;  
        }  
    }  
    return 0;  
}  

知识点解析

  1. 使用 map<string, int> 统计小写单词频率。
  2. 遍历输入单词,转换为小写后更新计数。
  3. 遍历哈希表,找到频率最高的单词。 参考代码
#include <bits/stdc++.h>  
using namespace std;  
int main() {  
    int n;  
    cin >> n;  
    map<string, int> cnt;  
    string s;  
    while (n--) {  
        cin >> s;  
        transform(s.begin(), s.end(), s.begin(), ::tolower);  
        cnt[s]++;  
    }  
    int max_count = 0;  
    string ans;  
    for (auto& [word, count] : cnt) {  
        if (count > max_count) {  
            max_count = count;  
            ans = word;  
        }  
    }  
    cout << ans;  
    return 0;  
}  

核心:哈希表统计与字符串处理。