编程未来 Coding Future

2026年9月 GESP C++ 3级

GESP · 3级 · 2026-09

60:00
满分 100.0
时长 60 分钟
27

2026年9月 GESP C++ 3级认证考试真题(客观题部分)

单选题(共 15 题,每题 2 分)

1

关于计算机的数据编码,下面说法不正确的是( )。

2

关于进制转换,下面说法不正确的是( )

3

下面程序的运行结果是( )

#include <iostream>
using namespace std;
int main() {
    int x = 1;
    for (int i = 0; i = 0; i <= 5) {
        x++;
    }
    cout << x << endl;
    return 0;
}
4

关于计算机编码中补码,下面说法错误的是( )。

5

下面程序执行的结果是( )。

#include <iostream>
using namespace std;
int main() {
    int x = 2026;
    int count = 0;
    while (x > 0) {
        count++;
        x = x & (x - 1);
    }
    cout << count << endl;
}
6

关于位运算,下列说法错误的是( )。

7

计算 3 & 7 | 15 ^ ~11(a=3, b=7, c=15, d=11):( )。

8

下面函数是一个加密解密的函数,横线处应该填入的程序段是( )。

#include <iostream>
#include <string>
using namespace std;
int main() {
    int key;
    cin >> key;
    string msg = "Hello GESP";
    cout << msg << endl;
    for (int i = 0; i < msg.size(); i++) {
        msg[i] = msg[i] ^ key;
    }
    cout << msg << endl;
    _________________________________
    cout << msg << endl;
    return 0;
}
9

下列程序是分别判断输入的 N 个数是否可能是二进制、八进制、十进制、十六进制,横线处应该填入的是
( )

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

下面的程序是位掩码技术实现权限的组合管理。首先定义四个权限常量,分别对应读、写、修改、删除,
每个权限占用整数的一个独⽴二进制位。初始化权限掩码 mask 为 0,代表没有任何权限。如果想实现如下的操
作:添加读权限;添加写权限;清除读权限,其他位不变;添加删除权限。则横线处应该填入的是( )。

#include <iostream>
using namespace std;

int main() {
    const int READ = 1 << 0;
    const int WRITE = 1 << 1;
    const int MODIFY = 1 << 2;
    const int DELETE_ = 1 << 3;
    int mask = 0;
    __________________________
    return 0;
}
11

下面选项中提到的变量都是正整数,关于位运算,下面说法错误的是( )。

12

已知:a=0, b=2, c=11, d=7, e=5,表达式 !a & b << c ^ d | e 的结果是( )

13

关于 string 的成员函数,下面说法错误的是( )

14

以下数组定义,符合 C++ 语法的是( )

15

三进制有个奇妙的应用,有 1000 个酒缸,恰好 1 缸有毒。毒酒喝下后 24 小时毒发死亡;无毒酒无影响。
总共有 48 小时,可以做两轮实验,每轮可以重新安排老鼠喝酒。有三种情况,这只老鼠两轮都不喝这缸酒;这只老
鼠第一轮喝这缸酒;这只老鼠第二轮喝这缸酒,要保证找出毒酒,最少需要多少只老鼠?( )

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

16

对于计算机编码运算,补码做加法运算时,如果最高位产生进位,需要把该进位循环加到结果的最低位。

17

求 的补码,可以对正数 的二进制,从右向左扫描,遇到第一个 之后,右边所有位全部取反,左边
保持不变。

18

一个 8 位二进制原码表⽰的有符号数,可表⽰的数值范围是 到 。

19

这段代码执行后,能够将数组中所有大于 0 的元素赋值为 0。

int a[] = {2, -5, 7, 0, -1};
int n = sizeof(a) / sizeof(a[0]);
for (int num : a) {
    if (num > 0) {
        num = 0;
    }
}
20

a 是 int 有符号整型,若 (a & 1) == 1 结果为 true,则 a 一定是正奇数。

21

char str[4] = "GESP"; 将在内存空间中给 str[4] 分配 5 个字节。

22

判断字符串中字符是否是 '0' 或者 '1',可以写条件:if(str[i]==0 || str[i]==1)。

23

下面程序执行后,将输出 98。

#include <iostream>
using namespace std;
int main() {
    int a = 'a', b = 'b';
    if (a > 0 || b++ > 0) {
    }
    cout << b;
}
24

枚举可以在保证不漏解的前提下缩小枚举范围,不是必须遍历全部。
6 / 10

25

下面流程图逻辑:初始化 , ;当 成⽴时,执行 ,再执行 ;
循环结束输出 sum。该流程图可以正确计算一维数组 a[0]∼a[n] 全部元素的总和。

编程操作题(共 2 题,共 50 分)

26
编程操作题 25分

试题名称:公共二进制位

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

题目描述

小红有 $n$ 个非负整数 $a_1,a_2,\ldots,a_n$。她将每个整数转换为二进制后,想知道有多少个二进制位在所有整数中均为 $1$。

二进制位从右向左编号为 $0,1,2,\ldots$。若某个整数的二进制表示中没有第 $k$ 位,则认为它的第 $k$ 位为 $0$。

请你求出满足条件的二进制位数量。

输入格式

  • 第一行一个整数 $n$,表示整数的个数。
  • 第二行 $n$ 个非负整数 $a_1,a_2,\ldots,a_n$。

输出格式

输出一个整数,表示所有整数的二进制表示中均为 $1$ 的二进制位数量。

样例输入 #1

3
13 7 15

样例输出 #1

2

说明/提示

样例解释 1

三个整数的二进制表示分别为 $(1101)_2$、$(0111)_2$ 和 $(1111)_2$。

其中第 $0$ 位和第 $2$ 位均为 $1$,因此答案为 $2$。

数据范围

$2\le n\le 20000$,$0\le a_i\le 10^9$。

27
编程操作题 25分

试题名称:分割字符串

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

题目描述

小明拿到了一段字符串文本,小明希望用下面的规则分割这个字符串:

  1. 小明从左到右扫描字符串,遇到第一个空格后停止,并将字符串分割为左右两个部分(舍弃用于分割的这个空格);
  2. 对于上次分割后右侧的字符串,小明继续扫描,第一次遇到连续两个空格后停止,并将字符串分割为左右两个部分(舍弃用于分割的这两个空格);
  3. 对于上次分割后右侧的字符串,小明继续扫描,第一次遇到连续三个空格后停止,并将字符串分割为左右两个部分(舍弃用于分割的这三个空格);
  4. 以此类推,小明每分割一次,下一次分割就需要更长的连续空格;直到字符串无法再次分割。

最后输出每次分割的左侧的字符串,以及最后一次分割的右侧字符串。

如果字符串完全无法进行任何一次分割,直接输出其本身。

输入格式

输入一行,一个字符串。

输出格式

输出若干行。每行为分割后的一个字符串,注意依次输出:

第一次分割左侧的字符串,第二次分割左侧的字符串,……,最后一次分割左侧的字符串,最后一次分割右侧的字符串。

样例输入 #1

sdfd 55 55   99312

样例输出 #1

sdfd
55 55
 99312

样例输入 #2

AbCd   999

样例输出 #2

AbCd

999

说明/提示

样例解释 1

  1. 第一次分割将字符串分割为 sdfd55 55 99312
  2. 第二次分割将字符串分割为 55 55 99312

对于第二次分割,注意 5555 之间虽然有空格,但是第二次分割需要连续两个空格才行;

另外,55 5599312 之间有三个空格,第二次分割只需要两个,所以会分割为 55 55 99312,也就是右侧会留下一个空格;因为只留下了一个空格,所以不再满足第三次分割要求。

样例解释 2

  1. 第一次分割将字符串分割为 AbCd 999
  2. 第二次分割将字符串分割为 空字符串 和 999

由于 AbCd999 之间有三个空格,第一次分割消耗掉一个,因此还能进行第二次分割,这个时候会分割出空字符串,因此输出中会输出一个空行(不能省略)。

数据范围

字符串长度不超过 $1000$,字符串中只包含大写字母、小写字母,数字,或空格,且输入字符串不会以空格结尾。

特别强调:输入仅一行,但可能包含若干空格

已答 0/27