GESP 客观题评测系统

2025-03-Level-3

2025-03-Level-3

试卷解析总览,可直接查看每题答案与解析。

单选题(每题 2 分)

1 题(单选题

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

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

正确答案D

解析详情

【答案】D 【考点】数据编码(Base64) 【解析】Base64 编码规则是每 3 个字节的数据编码为 4 个字节的字符。计算公式为:ceil(输入长度 / 3) * 4。对于 10 字节的输入:ceil(10 / 3) = 4,即需要 4 组编码块,编码后的长度为 4 * 4 = 16 字节。末尾不足 3 字节的部分会使用 '=' 进行填充以补足 4 字节的倍数。 【易错点】忽略了向上取整或补位填充的规则,误以为是按比例简单计算得到 13.33 进而选 B 或 C。

2 题(单选题

UTF-8编码规则如下:

1 字节:0xxxxxxx

2 字节:110xxxxxx 10xxxxxx

3 字节:1110xxxxxx 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

解析详情

【答案】B 【考点】数据编码(UTF-8) 【解析】根据题干给出的 UTF-8 编码规则校验各选项: A. 0xC0 (11000000) 符合 2 字节开头,但 0xC0 0x80 对应的码位可以用 1 字节表示,属于过长编码(Overlong Encoding),在标准 UTF-8 中通常非法。 B. 0xF0 (11110000) 符合 4 字节开头(11110xxx),后续三个字节 0x90, 0x80, 0x80 均以 10 开头,完全符合 4 字节编码规则。 C. 0x80 (10000000) 以 10 开头,在 UTF-8 中只能作为后续字节,不能作为首字节。 D. 0xFF (11111111) 不符合题干中任何一个字节序列的前缀定义。 【易错点】未掌握 UTF-8 各字节的前缀特征,尤其是首字节与后续字节的区别,或者混淆了多字节编码的起始位。

3 题(单选题

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

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

正确答案A

解析详情

【答案】A 【考点】数制转换、原码表示 【解析】1. 首先转换数值:八进制数 5 等于十进制数 5。 2. 在 8 位二进制表示中,最高位为符号位(0 为正,1 为负),其余 7 位为数值位。 3. 十进制数 5 的 7 位二进制表示为 0000101。 4. 因为是负数 -5,所以符号位取 1。拼接符号位和数值位得到原码:10000101。 【易错点】混淆原码、反码和补码的定义(B 为反码,C 为补码),或者在八进制转十进制时出错。

4 题(单选题

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

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

正确答案A

解析详情

【答案】A 【考点】进制转换(十进制转二进制) 【解析】1. 整数部分:111 采用“除 2 取余”法。111 = 64 + 32 + 8 + 4 + 2 + 1 = 2^6 + 2^5 + 2^3 + 2^2 + 2^1 + 2^0,对应二进制为 1101111。 2. 小数部分:0.111 采用“乘 2 取整”法: 0.111 * 2 = 0.222 -> 0 0.222 * 2 = 0.444 -> 0 0.444 * 2 = 0.888 -> 0 0.888 * 2 = 1.776 -> 1 0.776 * 2 = 1.552 -> 1 0.552 * 2 = 1.104 -> 1 ... 得到序列 .000111...,观察选项 A 符合整数部分和小数部分前几位的特征。 【易错点】小数部分转换规则不熟练,或者在整数部分计算 2^4 位(16)时出现疏漏导致结果偏差。

5 题(单选题

在 C++ 中,补码的主要作用是()

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

正确答案B

解析详情

【答案】B 【考点】计算机补码原理 【解析】补码的主要设计目标是将减法运算转换为加法运算。在计算机硬件中,减去一个数等同于加上这个数的补码,这样 CPU 只需要设计加法器电路即可完成加减法运算,极大地简化了逻辑电路的设计。 【易错点】误认为补码是为了增加范围(虽然 8 位补码确实比原码多表示一个 -128,但这并非主要作用)或优化内存。

6 题(单选题

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

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

正确答案A

解析详情

【答案】A 【考点】有符号整数补码表示范围 【解析】对于 n 位有符号整数,补码表示的范围是 -2^(n-1) 到 2^(n-1) - 1。当 n = 8 时,范围是 -2^7 到 2^7 - 1,即 -128 到 127。其中 10000000 被定义为 -128。 【易错点】混淆有符号和无符号的范围(D 为无符号范围),或者记错正数边界(误以为是 128 而非 127)。

7 题(单选题

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

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

正确答案C

解析详情

【答案】C 【考点】数据类型转换、补码存储机制 【解析】在 C++ 中,将有符号整数赋值给无符号整数时,底层的二进制补码位模式保持不变。-5 的 32 位补码表示为 0xFFFFFFFB。将其解释为 unsigned int 时,最高位的 1 不再作为符号位,而是数值位。其计算方式为 2^32 - 5 = 4294967296 - 5 = 4294967291。 【易错点】认为负数不能赋值给无符号数导致编译错误,或认为无符号转换会自动取绝对值得到 5。

8 题(单选题

下列程序的作用是()

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

正确答案A

解析详情

【答案】A 【考点】C++ 标准流操纵符(oct) 【解析】在 C++ I/O 流中,`oct` 是一个流操纵符,用于设置后续整数输出的基数为八进制。代码中 `cout << oct << decimal;` 会将十进制数 25 转换为八进制(31)并输出。 【易错点】对 `oct`(八进制)、`dec`(十进制)、`hex`(十六进制)这些关键字的含义记忆混淆。

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

解析详情

【答案】C 【考点】C++ 标准流操纵符(hex) 【解析】题目要求将十进制数转换为十六进制输出。C++ 中使用 `hex` 操纵符可以实现这一功能。因此横线处应填写 `cout << hex << decimal;`。 【易错点】混淆了不同进制对应的操纵符,例如 `oct` 是八进制,而题目要求的是十六进制。

10 题(单选题

以下代码的说法正确的是什么()

#include <iostream>
using namespace std;

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

正确答案D

解析详情

【答案】D 【考点】位运算(按位异或) 【解析】在 C++ 中,`^` 运算符代表按位异或(Bitwise XOR)。它会将参与运算的两个数转换成二进制,然后对每一位进行比较:如果相同则该位为 0,不同则该位为 1。因此选项 D 描述正确。 【易错点】误将 `^` 理解为数学中的乘方运算(如 2^3)或逻辑同或运算。

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++) {
        __________________
        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])

正确答案D

解析详情

【答案】D 【考点】枚举算法、数组最大值查找 【解析】在遍历数组查找最大值及其索引时,我们需要将“当前遇到的元素 `arr[i]`”与“目前记录的最大元素 `arr[maxIndex]`”进行比较。如果当前元素更大,则更新最大值的索引。因此判断条件应为 `if (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--;

正确答案D

解析详情

【答案】D 【考点】双指针算法、数组元素分区 【解析】该程序使用双指针策略。`left` 指针从左向右寻找第一个偶数,`right` 指针应从右向左寻找第一个奇数。当 `left` 找到偶数且 `right` 找到奇数时执行交换。缺失部分应处理 `right` 指针:当右侧元素已经是偶数(满足分区要求)时,`right` 继续左移。故填写 `while (arr[right] % 2 == 0 && left < right) right--;`。 【易错点】指针移动方向控制错误(如 B 选项让 `left` 递减),或奇偶性判断逻辑与指针角色不匹配。

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++");

正确答案B

解析详情

【答案】B 【考点】C++ string 类的 replace 成员函数 【解析】`str.replace(pos, len, new_str)` 的含义是从索引 `pos` 开始,将长度为 `len` 的子串替换为 `new_str`。在 "HelloWorld" 中,"Hello" 占据索引 0-4,"World" 从索引 5 开始,长度为 5。要得到 "HelloC++",需要将索引 5 开始的 5 个字符替换为 "C++"。因此 B 选项正确。 【易错点】混淆了字符串的起始索引(从 0 开始)或误解了 `replace` 第二个参数(是长度而非结束位置)。

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);

正确答案D

解析详情

【答案】D 【考点】C++ string 类的 insert 和 substr 函数 【解析】1. `str.insert(5, "World")` 在原字符串索引 5 处(即 "Hello" 之后)插入 "World",字符串变为 "HelloWorldC+"。 2. `str.substr(5, 5)` 从索引 5 开始提取长度为 5 的子串,正好提取出刚才插入的 "World"。选项 D 的逻辑链完整且索引正确。 【易错点】忽略了插入操作对原字符串索引的影响,或混淆了 `substr` 提取长度的参数含义。

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)

正确答案C

解析详情

【答案】C 【考点】逻辑运算、条件判定 【解析】根据题意,“美丽数字”必须同时满足两个条件: 1. 是 9 的倍数,即 `a % 9 == 0`。 2. 不是 8 的倍数,即 `a % 8 != 0`。 这两个条件是“且”的关系,应使用逻辑与运算符 `&&`。因此正确选项为 C。 【易错点】混淆逻辑与 `&&` 和逻辑或 `||`,或在判断“不是某数倍数”时误用了 `== 0`。

判断题(每题 2 分)

1 题(判断题

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

正确答案错误

解析详情

【答案】错误 【考点】三角形构成条件、逻辑严密性 【解析】虽然“任意两边之和大于第三边”是构成三角形的标准几何条件,但题目使用了“只有”这一绝对化表述。在数学上,也可以表达为“任意两边之差小于第三边”。此外,在编程实现时,还必须显式或隐式地满足“三条边长均大于 0”这一基础前提。因此该说法不严谨。 【易错点】忽略了“只有”这一限定词,或者未考虑到边长必须为正数这一隐含条件。

2 题(判断题

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

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

正确答案正确

解析详情

【答案】正确 【考点】位运算(按位与)、ASCII 码奇偶性判断 【解析】字符在内存中以 ASCII 码形式存储。表达式 `x & 1` 是将字符的二进制表示与 1 进行按位与运算。奇数的二进制最后一位必然是 1,偶数是 0。因此 `x & 1` 结果为 1 时(真)代表 ASCII 码为奇数,输出 "YES",逻辑正确。 【易错点】不熟悉使用位运算 `& 1` 来快速判断整数奇偶性的技巧。

3 题(判断题

闰年的定义:

普通闰年:公历年份是 4 的倍数,且不是 100 的倍数的,为闰年(如 2004 年、2020 年等就是闰年)。世纪闰年:公历年份是整百数的,必须是 400 的倍数才是闰年(如 1900 年不是闰年,2000 年是闰年)。下面程序是判断是否是闰年的正确程序

cin >> n;
cout << (((n % 4 == 0 && n % 100 != 0) || (n % 400 == 0)) ? 1 : 0);
return 0;

正确答案正确

解析详情

【答案】正确 【考点】逻辑运算、闰年判定逻辑 【解析】程序中的逻辑表达式 `(n%4==0 && n%100!=0) || (n%400==0)` 完全对应了闰年的两个定义分支:左侧处理“普通闰年”,右侧处理“世纪闰年”。通过三目运算符输出 1 或 0,符合判断逻辑。 【易错点】对逻辑与 `&&` 和逻辑或 `||` 的运算优先级产生疑惑(`&&` 优先级高于 `||`,此处括号可省略但加上更清晰)。

4 题(判断题

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

正确答案正确

解析详情

【答案】正确 【考点】数学逻辑、整除判定法则 【解析】一个整数若能同时被 3 和 5 整除,由于 3 和 5 是互质数,根据数论性质,该数一定能被它们的最小公倍数 15(3 * 5)整除。因此 `n % 15 == 0` 是判断“同时被 3 和 5 整除”的等价且高效的写法。 【易错点】误以为必须拆分为两个 `if` 条件判断,忽略了最小公倍数的应用。

5 题(判断题

有 n 个同学,从中抽取任意个人数来参加学校组织的大合唱,共有 2 的 n 次幂个方法

正确答案正确

解析详情

【答案】正确 【考点】组合数学、幂集概念 【解析】从 n 个同学中抽取任意人数,本质上是求这 n 个同学构成的集合的所有子集的个数。对于每一个同学,都有“选中”或“不选中”两种选择。根据乘法原理,总的选择方法数为 2 * 2 * ... * 2 (共 n 个) = 2^n。这包括了 0 个人和 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 转换为二进制:2025 = 1024 + 512 + 256 + 128 + 64 + 32 + 8 + 1。写成二进制形式为 11111101001。通过统计,其中 1 的个数共有 8 个。由于 8 是偶数,符合题目中 A 类数的定义。因此命题正确。 【易错点】在将十进制数分解为 2 的幂次求和的过程中出现漏算或多算。

7 题(判断题

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

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

正确答案正确

解析详情

【答案】正确 【考点】循环结构(while)、算术运算 【解析】这段程序以 `n != 0` 为循环条件。在每次循环内部,先输出当前的商 `n/2` 和余数 `n%2`,然后执行 `n /= 2` 将 n 更新为原来的二分之一。这完全符合“不停地除以 2 并输出商和余数,直到 n 为 0”的描述。 【易错点】忽略了 C++ 整数除法自动向下取整的特性,或者对循环终止条件的边界产生误解。

8 题(判断题

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

正确答案正确

解析详情

【答案】正确 【考点】进制运算、基数转换 【解析】在十进制下,A + B = 10 + 11 = 21。将十进制结果 21 转换为十三进制:21 除以 13,商为 1,余数为 8。因此十进制的 21 对应十三进制的 18。计算过程完全正确。 【易错点】在进行进制转换时,习惯性地按十进制进位规则思考,导致计算错误。

9 题(判断题

k 进制,逢 k 进第二位,k^2 进百位,k^3 进千位;

正确答案错误

解析详情

【答案】错误 【考点】进位计数制基础概念 【解析】在 k 进制中,进位规则统一是“逢 k 进一”。即当前位数值达到 k 时,就向高一位进 1。所谓“百位”、“千位”是十进制下的特有称呼,在 k 进制中对应的是第三位和第四位。其位权虽然分别是 k^2 和 k^3,但并不意味着“逢 k^2 进位”。 【易错点】混淆了“位权(权值)”与“进位基数”的概念。

10 题(判断题

CCF(十九进制)=21AC(十三进制)(不区分大小写)

正确答案错误

解析详情

【答案】错误 【考点】进制转换、大数计算 【解析】1. 十九进制 CCF 换算为十进制:12 * 19^2 + 12 * 19 + 15 = 4332 + 228 + 15 = 4575。 2. 十三进制 21AC 换算为十进制:2 * 13^3 + 1 * 13^2 + 10 * 13 + 12 = 4394 + 169 + 130 + 12 = 4705。 3. 因为 4575 不等于 4705,所以该等式不成立。 【易错点】在处理非十进制字母(如 C=12, F=15)时数值代入错误,或在 19^2, 13^3 等大数乘法时出现计算疏忽。