CCF GESP 2026年6月认证 C++ 3级试题
CCF GESP 2026年6月认证 C++ 3级试题
- 场次:2026年6月
- 满分:100 分
- 题目来源:官方直发原件
1 单选题(每题 2 分,共 30 分)
关于计算机的数据编码,下面说法正确的是( )。
计算机厂商为了计算方便,一般采用 1000 进制。如果我们买的厂商标注的是 1 TB 的硬盘,它实际的存储容量是( )。
低 4 位、高 4 位压缩技术,适用于数据仅使用字节的一部分(如仅用低 4 位)的场景。字节结构:一个字节为 8 位,分为高 4 位(高位)和低 4 位(低位)。当数据是十六进制数(0∼15,即 0x0 到 0xF),每个值仅需 4 位表示,高 4 位全为 0。将两个相邻的 4 位值合并为一个字节。四个数据 0x1、0x2、0x3、0x4 采用上述压缩技术压缩以后是( )。
原文保真说明:来源改写 1 处(照原卷保留,未作修改)
来源题面被改写数值印错题干
原卷作
$0\sim 15$,常规写法应为$0$ 到 $15$洛谷/初稿把公式范围写成「0 到 15」;官方 PDF 第 1 页为 $0\sim 15$,已按 600 dpi 宽裁恢复。
已按官方原件恢复:现为原卷原文
关于计算机编码中反码和补码,下面说法错误的是( )。
一种加密方式是字符数组与密钥 KEY、运算方式分开传输,比如字符数组 char text[4] = {'G', 'E', 'S', 'P'}; 由一种传输方式发送,密钥 KEY = 2026 通过另一种发送方式发送,运算方式 char function[4] = {'|', '-', '^', '+'}; 又是另一种发送方式发送。三种数据都到达目的地以后,分别进行例如 'G' | 6、'E' - 2、'S' ^ 0、'P' + 2 等计算,来得到相应的真实内容,上述 GESP 通过这种加密方式,加密以后最终的内容是( )。
关于位运算,下列说法错误的是( )。
关于字符串和字符数组,下列说法正确的是( )。
原文保真说明:来源改写 1 处(照原卷保留,未作修改)
来源题面被改写版式选项 1
原卷作
char str[] = "GESP";,常规写法应为`char str[] = "GESP"; int len1 = sizeof(str); int len2 = strlen(str);` 上面程序能够正确执行,`len1` 与 `len2` 相等。洛谷把原卷第 2 页选项 A–D 的多行代码清单压成一行;已按 PDF 字形列位重建恢复为代码围栏(装订线行号不入正文)。
已按官方原件恢复:现为原卷原文
计算机中的 2 KB 等于多少 bit( )。
在 C++ 中,对于 32 位有符号整数 int 类型数据 n,关于按位取反运算符 ~,下列说法正确的是( )。
关于计算机中的二进制编码表示,下列说法错误的是( )。
下面选项中提到的变量都是正整数,关于位运算,下面说法错误的是( )。
a=7, b=3, c=14, d=15, e=8,对于运算表达式 !a << b & c ^ d | e 的结果是( )。
关于 string 的成员函数,下面说法错误的是( )。
以下数组定义,符合 C++ 语法的是( )。
现在有一个数,请你分别判断它们是否可能是二进制、八进制、十进制、十六进制。例如,6AFF 就只可能是十六进制,而 1011 则是四种进制皆有可能。输入 N(保证 1≤N≤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;
}
原文保真说明:来源改写 1 处(照原卷保留,未作修改)
来源题面被改写数值印错题干
原卷作
$1 \le N \le 1000$,常规写法应为$1 \le N \le 10-0$洛谷有题 OCR 把 1000 写成 10-0;官方 PDF 第 4 页为 $1 \le N \le 1000$,已按页面图像恢复。
已按官方原件恢复:现为原卷原文
2 判断题(每题 2 分,共 20 分)
判断题「√」表示正确,「×」表示错误
反码运算时,产生的进位需要循环进位,即最高位产生的进位要加回到结果的最低位。
原文保真说明:来源改写 1 处(照原卷保留,未作修改)
来源题面被改写措辞改写题干
原卷作
反码运算时,产生的进位需要循环进位,即最高位产生的进位要加回到结果的最低位。,常规写法应为又到期末考试周,小明发现这次许多闭卷考试不仅禁止携带手机、平板电脑,还有最近比较时髦的各类 AI 眼镜(也有叫智能眼镜)也同样不允许带入考场。这些 AI 眼镜应该也是内置了操作系统并可能支持 Wi-Fi 或蓝牙连接。洛谷有题 1215 判断第 1 题题干被换成无关的「AI 眼镜」文段;已按官方 PDF 第 4 页恢复。答案表仍为 √,与洛谷 A 一致。
已按官方原件恢复:现为原卷原文
−11 的补码的一种计算方式是从右往左扫描正数的二进制形式,遇到第一个 1 之后,左边的所有位都取反。
一个 8 位的二进制数补码,最大的表示范围是从 −127 到 +127。
原文保真说明:来源改写 1 处(照原卷保留,未作修改)
来源题面被改写数值印错题干
原卷作
$+127$,常规写法应为$127$初稿漏掉上界正号;官方 PDF 第 4 页为 $+127$,已按 600 dpi 宽裁恢复。
已按官方原件恢复:现为原卷原文
判断某个数是否是质数,枚举范围可适当缩小(遍历到 i 而非 i),提升效率。
原文保真说明:来源改写 1 处(照原卷保留,未作修改)
来源题面被改写数值印错题干
原卷作
$\sqrt{i}$ 而非 $i$,常规写法应为$\sqrt{n}$ 而非 $n$初稿按常规范式写成 √n;官方 PDF 第 4 页公式变量为 i,已按 600 dpi 宽裁恢复。
已按官方原件恢复:现为原卷原文
如果 a 为 int 类型的变量,且表达式 ((a & 1) == 1) 的值为 true,则说明 a 是奇数。
十六进制数 CCF 对应的二进制数、八进制数、十进制数分别是:110011001111、6317、3269。
下列程序如果能够正确执行,那么输出的结果是 GESP。
int main() {
string name = "GESP";
cout << name[false] << name[true] << name[1 << 1] << name[7 >> 1] << endl;
}
某个初学 C++ 的学生,在对照参考程序写了一个程序以后,信心满满地进行编译,他敲进编译器的全部代码如下,这个程序能够正常编译运行。
1 #include<bits/stdc++.h>
2 using namespace std;
3 int main() {
4 cout << "Hello world!" << endl;
5 return 0;
6 }
原文保真说明:来源改写 1 处(照原卷保留,未作修改)
来源题面被改写版式题干
原卷作
4 cout << "Hello world!" << endl;,常规写法应为4 cout << "Hello world!" << endl;洛谷行号 4/5 后少一空格;已按官方 PDF 第 5 页列位重建恢复。原卷把行号印进代码正文(考生照抄参考程序时连行号一起敲了)。
已按官方原件恢复:现为原卷原文
代码逐行复刻手工运算步骤,中间不能增加任何判断逻辑,否则就不属于模拟算法。
判断一个 int 型数字 s[i] 是不是在 0 和 9 之间(可以是 0 和 9),判断条件可以写为 if (s[i] >= '0' && s[i] <= '9')。
3 编程题(每题 25 分,共 50 分)
加密
C++时间 1 s内存 512 MB标准输入输出
小杨同学有一串数字,想把它们变成另一串数字,这个过程叫做加密。
他有一本密码本,密码本告诉你:每个数字应该变成哪个数字。
数字一共有 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 加密后变成什么。
输出格式
输出加密后的数字。
也就是:把输入第二行里的每个数字,都按照输入第三行的密码本换掉后输出。
样例
7 0 2 0 3 4 1 9 9 0 1 2 3 4 5 6 7 8
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。
你的代码(C++)
提交后由评测机编译运行,结果见下方76 B / 64 KB
判题结果
字符转换
C++时间 1 s内存 512 MB标准输入输出
小杨同学有一串字符,里面可能有:
- 大写字母,比如 A、B、C
- 小写字母,比如 a、b、c
- 数字,比如 0、1、2
现在小杨同学想把这串字符变一变,规则如下:
- 如果是大写字母,就变成对应的小写字母;
- 如果是小写字母,就变成对应的大写字母;
- 如果是数字,就变成
*。
请你按照这个规则,帮小杨把整串字符转换好。
输入格式
输入一共有 2 行。
第一行:一个整数,表示这串字符一共有多少个字符。
第二行:一串连续的字符,中间没有空格。
输出格式
输出转换后的字符。
注意:输出时字符之间不要加空格。
样例
5 aBc98
AbC**
原来的字符是:
aBc98
从左到右一个一个看:
- a 是小写字母,所以变成 A;
- B 是大写字母,所以变成 b;
- c 是小写字母,所以变成 C;
- 9 是数字,所以变成
*; - 8 是数字,所以变成
*。
所以最后输出:
AbC**
数据范围
字符个数不会超过 1000 个。
每个字符只会是大写字母、小写字母或数字。
你的代码(C++)
提交后由评测机编译运行,结果见下方76 B / 64 KB