2026年06月GESP认证C++编程三级真题试卷

一、单选题(每题 2 分,共 30 分)
第 1 题 关于计算机的数据编码,下面说法正确的是( )。
第 2 题 计算机厂商为了计算方便,一般采用 1000 进制。如果我们买的厂商标注的是 1 TB 的硬盘,它实际的存储容量是( )。
A. $1000 \times 1000 \times 1000 \times 1000 \div 1024 \div 1024 \div 1024=931Gb$
B. $1000 \times 1000 \times 1000 \times 1000 \div 1024 \div 1024 \div 1024=931GB$
C. $1024 \times 1024 \times 1024 \times 1024 \div 1024 \div 1024 \div 1024=1049GB$
D. $1000 \times 1024 \times 1024 \times 1024 \div 1024 \div 1024 \div 1024=977Gb$
第 3 题 低 4 位、高 4 位压缩技术,适用于数据仅使用字节的一部分(如仅用低 4 位)的场景。字节结构:一个字节为8位,分为高4位(高位)和低4 位(低位)。当数据是十六进制数(0~15 ,即 0x0 到 0xF ),每个值仅需 4位表示,高4位全为 0 。将两个相邻的4位值合并为一个字节。四个数据 0x1 、0x2 、0x3 、0x4 采用上述压缩技术压缩以后是( )。
第 4 题 关于计算机编码中反码和补码,下面说法错误的是( )。
B. 对于一个 $n$ 位的二进制数:最大表示范围:$[-(2^{n-1}-1),+(2^{n-1}-1)]$ 。
第 5 题 一种加密方式是字符数组与密钥 KEY 、运算方式分开传输,比如字符数组 char text[4] = {'G', 'E', 'S', 'P'}; 由一种传输方式发送,密钥 KEY = 2026 通过另一种发送方式发送,运算方式 char function[4] = {'|', '-', '^', '+'}; 又是另一种发送方式发送。三种数据都到达目的地以后,分别进行例如 'G' | 6 、'E' - 2 、'S' ^ 0 、'P' + 2 等计算,来得到相应的真实内容,上述 GESP 通过这种加密方式,加密以后最终的内容是( )。
第 6 题 关于位运算,下列说法错误的是( )。
C. 将二进制位整体左移 n 位,高位溢出舍弃,低位补 0 ;等价于 num 乘以$2^n$ 。
第 7 题 关于字符串和字符数组,下列说法正确的是( )。
第 8 题 计算机中的 2 KB 等于多少 bit ( )。
第 9 题 在 C++ 中,对于 32 位有符号整数 int 类型数据 n ,关于按位取反运算符 ~ ,下列说法正确的是( )。
第 10 题 关于计算机中的二进制编码表示,下列说法错误的是( )。
D. 对于一个 n 位的二进制数,补码最大表示范围为$[-2^{n-1}, +2^{n-1}]$ 。
第 11 题 下面选项中提到的变量都是正整数,关于位运算,下面说法错误的是( )。
第 12 题 a=7, b=3, c=14, d=15, e=8 ,对于运算表达式 !a << b & c ^ d | e 的结果是( )。
第 13 题 关于 string 的成员函数,下面说法错误的是( )。
第 14 题 以下数组定义,符合 C++ 语法的是( )。
第 15 题 现在有一个数,请你分别判断它们是否可能是二进制、八进制、十进制、十六进制。例如, 6AFF 就只可能是十六进制,而 1011 则是四种进制皆有可能。输入 N (保证 $1 \leq N \leq 1000)$),表示有 N 个数让你进行判断,接下来输入 N 个字符串(保证所有字符串长度不超过 10 ),判断可能是四个进制当中的哪个进制数。输出 N 行,每行 4 个数,用空格隔开,分别表示给定的字符串是否可能表示一个二进制数、八进制数、十进制数、十六进制数。使用 1 表示可能,使用 0 表示不可能。下面程序横线处可以满足这个要求的是( )。
#include <iostream>
using namespace std;
int main() {
	int n = 0;
	cin >> n;
	for (int i = 0; i < n; i++) {
		char str[11];
		cin >> str;
		char max = '0';
		for (int i = 0; str[i] != '\0'; i++)
			if (str[i] > max)
				max = str[i];
		___________________________________________
	}
	return 0;
}
二、判断题(每题 2 分,共 20 分)
第 1 题 反码运算时,产生的进位需要循环进位,即最高位产生的进位要加回到结果的最低位。
第 2 题 -11 的补码的一种计算方式是从右往左扫描正数的二进制形式,遇到第一个 1 之后,左边的所有位都取反。
第 3 题 一个 8 位的二进制数补码,最大的表示范围是从 -127 到 +127。
第 4 题 判断某个数是否是质数,枚举范围可适当缩小(遍历到 $\sqrt{i}$ 而非 $i$ ),提升效率。
第 5 题 如果 a 为 int 类型的变量,且表达式 ((a & 1) == 1) 的值为 true ,则说明 a 是奇数。
第 6 题 十六进制数 CCF 对应的二进制数、八进制数、十进制数分别是: 110011001111 、6317 、3269 。
第 7 题 下列程序如果能够正确执行,那么输出的结果是 GESP 。
int main() {
	string name = "GESP";
	cout << name[false] << name[true] << name[1 << 1] << name[7 >> 1] << endl;
}
第 8 题 某个初学 C++ 的学生,在对照参考程序写了一个程序以后,信心满满地进行编译,他敲进编译器的全部代码如下,这个程序能够正常编译运行。
#include<bits/stdc++.h>
using namespace std;
int main() {
	cout << "Hello world!" << endl;
	return 0;
}
第 9 题 代码逐行复刻手工运算步骤,中间不能增加任何判断逻辑,否则就不属于模拟算法。
第 10 题 判断一个 int 型数字 s[i] 是不是在 0 和 9 之间(可以是 0 和 9 ),判断条件可以写为 if (s[i] >= '0' && s[i] <= '9') 。
三、编程题(每题 25 分,共 50 分)
第 1 题 加密

题面描述

小杨同学有一串数字,想把它们变成另一串数字,这个过程叫做加密。

他有一本密码本,密码本告诉你:

每个数字应该变成哪个数字。

数字一共有 10 个:

0 、1 、2 、3 、4 、5 、6 、7 、8 、9

密码本会依次告诉你:

0 要变成什么

1 要变成什么

2 要变成什么

……

9 要变成什么

请你按照密码本,把原来的每个数字都换成新的数字,然后输出。

输入格式

输入共有 $3$ 行。

第一行:一个整数,表示有多少个数字需要加密;

第二行:这些需要加密的数字;

第三行:密码本,一共 $10$ 个数字。

这 $10$ 个数字的意思是:

第 $1$ 个数字:表示 0 加密后变成什么;

第 $2$ 个数字:表示 1 加密后变成什么;

第 $3$ 个数字:表示 2 加密后变成什么;

……

第 $10$个数字:表示 9 加密后变成什么。

输出格式

输出加密后的数字。

也就是:把输入第二行里的每个数字,都按照输入第三行的密码本换掉后输出。

输入数据#1 复制
7
0 2 0 3 4 1 9
9 0 1 2 3 4 5 6 7 8
输出数据#1 复制
9 1 9 2 3 0 8

数据要求

【样例解释】

第二行要加密的数字是:

0 2 0 3 4 1 9

第三行密码本是:

9 0 1 2 3 4 5 6 7 8

它的意思是:

- 0 变成 9

- 1 变成 0

- 2 变成 1

- 3 变成 2

- 4 变成 3

- 5 变成 4

- 6 变成 5

- 7 变成 6

- 8 变成 7

- 9 变成 8

所以:

0 变成 9

2 变成 1

0 变成 9

3 变成 2

4 变成 3

1 变成 0

9 变成 8

最后得到:

9 1 9 2 3 0 8

【 数据范围】

需要加密的数字个数不超过 $20000$ 个,且均为 $0$到 $9$;密码本中的数字不重复,且均为$0$到 $9$ 。

第 2 题 字符转换

题面描述

小杨同学有一串字符,里面可能有:

- 大写字母,比如 A 、B 、C

- 小写字母,比如 a 、b 、c

- 数字,比如 0 、1 、2

现在小杨同学想把这串字符变一变,规则如下:

1. 如果是大写字母,就变成对应的小写字母;

2. 如果是小写字母,就变成对应的大写字母;

3. 如果是数字,就变成 * 。

请你按照这个规则,帮小杨把整串字符转换好。

输入格式

输入一共有 $2$ 行。

第一行:一个整数,表示这串字符一共有多少个字符。

第二行:一串连续的字符,中间没有空格。

输出格式

输出转换后的字符。

注意:

输出时字符之间不要加空格。

输入数据#1 复制
5
aBc98
输出数据#1 复制
AbC**

数据要求

【样例解释】

原来的字符是:

aBc98

从左到右一个一个看:

1. a 是小写字母,所以变成 A ;

2. B 是大写字母,所以变成 b ;

3. c 是小写字母,所以变成 C ;

4. 9 是数字,所以变成 * ;

5. 8 是数字,所以变成 * 。

所以最后输出:

AbC**

【数据范围】

字符个数不会超过 $1000$ 个。

每个字符只会是大写字母、小写字母或数字。