CCF GESP 2026年9月认证 C++ 5级

所有 GESP 真题,手机上也能刷 · 自动判分 · 错题自动进错题本 扫码去刷
一 单选题
共 15 道 每题 2 分 共计 30 分
第 1 题

小杨用单链表保存任务序列,并同时维护头指针 head 和尾指针 tail 。在链表非空且已知 tail 的情况下,在表尾插入新结点的时间复杂度是( )。

struct Node {
    int value;
    Node *next;
};

Node *head;
Node *tail;
A

$O(1)$

B

$O(log n)$

C

$O(n)$

D

$O(nlog n)$

第 2 题

在不带哨兵结点的双向链表中,结点 p 既不是头结点也不是尾结点。删除 p 的正确代码是( )。

struct Node {
    int value;
    Node *prev;
    Node *next;
};
A
p->prev = p->next;
p->next = p->prev;
delete p;
B
p->prev->next = p;
p->next->prev = p;
delete p;
C
p->prev->next = p->next;
p->next->prev = p->prev;
delete p;
D
p->next = p->prev;
p->prev->next = nullptr;
delete p;
第 3 题

下面函数使用快慢指针查找单链表的中间结点。横线处应填写( )。

struct Node {
   int value;
   Node *next;
};

Node *middle(Node *head) {
    Node *slow = head;
    Node *fast = head;
    while (fast != nullptr && fast->next != nullptr) {
        slow = slow->next;
        ______________________
    }
    return slow;
}
A

fast = fast->next;

B

fast = fast->next->next;

C

fast = slow->next;

D

fast = head->next;

第 4 题

函数 gcd(int a, int b) 定义如下,则 gcd(105, 45) 的结果是( )。

int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}
A

3

B

5

C

15

D

45

第 5 题

下面函数用于判断正整数 n 是否为质数。横线处的最佳写法是( )。

bool isPrime(int n) {
    if (n < 2)
        return false;
    for (int i = 2; __________________; i++) {
        if (n % i == 0)
            return false;
    }
    return true;
}
A

i < n

B

i <= n / 2

C

i * i < n

D

(long long) i * i <= n

第 6 题

下面代码实现线性筛法。为了保证每个合数只被其最小质因子筛去一次,横线处应填写( )。

vector<int> linearSieve(int n) {
    vector<bool> composite(n + 1, false);
    vector<int> primes;

    for (int i = 2; i <= n; i++) {
        if (!composite[i])
            primes.push_back(i);
        for (int p : primes) {
            if ((long long)i * p > n)
                break;
            composite[i * p] = true;
            if (__________________)
                break;
        }
    }
    return primes;
}
A

p % i == 0

B

i % p == 0

C

i == p

D

i * p == n

第 7 题

根据唯一分解定理,整数 $756$ 的正确质因数分解是( )。

A

$2^2×3^3×7$

B

$2^3×3^2×7$

C

$2^2×3^2×21$

D

$2×3^3×14$

第 8 题

函数 f(int n) 定义如下,则 f(4) 的结果是( )。

int f(int n) {
    if (n == 1)
        return 1;
    return n + f(n - 1);
}
A

4

B

7

C

9

D

10

第 9 题

在升序数组中查找第一个严格大于 x 的元素位置,下面代码中的横线应填写( )。

int upperBound(const vector<int> &a, int x) {
    int l = 0, r = (int)a.size();
    while (l < r) {
        int mid  = l + (r - l) / 2;
        if (__________________) {
            l = mid + 1;
        } else {
            r = mid;
        }
    }
    return l;
}
A

a[mid] < x

B

a[mid] >= x

C

a[mid] <= x

D

a[mid] > x

第 10 题

小杨需要把若干箱货物按原顺序分配到 days 天中,每天运输连续的若干箱,求能够完成任务的最小载重量。函数 check(cap) 判断载重量为 cap 时能否在规定天数内运完。横线处应填写( )。

long long l = maxWeight;
long long r = totalWeight;

while (l < r) {
    long long mid  = l + (r - l) / 2;
    if (check(mid)) {
        ____________________
    } else {
        ____________________
    }
}
cout << l;
A

l = mid + 1; 和 r = mid;

B

r = mid; 和 l = mid + 1;

C

r = mid - 1; 和 l = mid;

D

l = mid; 和 r = mid - 1;

第 11 题

下面是归并排序中合并两个有序区间(升序排序)的部分代码。若希望排序保持稳定,横线处应填写( )。

while (i <= mid && j <= right) {
    if (__________________) {
        temp.push_back(a[i++]);
    } else {
        temp.push_back(a[j++]);
    }
}
A

a[i] < a[j]

B

a[i] > a[j]

C

a[i] >= a[j]

D

a[i] <= a[j]

第 12 题

下面快速排序的划分函数以 a[right] 为枢轴,并把不大于枢轴的元素移动到左侧。横线处应填写( )。

int partition(int a[], int left, int right) {
    int pivot = a[right];
    int i = left - 1;
    for (int j = left; j < right; j++) {
        if (__________________) {
            i++;
            swap(a[i], a[j]);
        }
    }
    swap(a[i + 1], a[right]);
    return i + 1;
}
A

a[j] <= pivot

B

a[j] > pivot

C

a[i] <= pivot

D

a[right] < a[j]

第 13 题

小杨要在一个教室安排尽可能多场活动,每场活动具有开始时间 start 和结束时间 end 。采用贪心算法时,正确的选择策略是( )。

struct Activity {
    int start;
    int end;
};
A

每次选择开始时间最早的活动

B

每次选择持续时间最短的活动

C

每次选择参与人数最少的活动

D

按结束时间从早到晚排序,依次选择与已选活动不冲突的活动

第 14 题

下面函数使用迭代方法求最大连续子段和。对于数组 {-2, 3, -1, 5, -6, 2} ,函数返回值是( )。

int maxSubArray(const  vector<int>  &a) {
    int best = a[0];
    int current = a[0];
    for (int i = 1; i < (int)a.size(); i++) {
        current = max(a[i], current + a[i]);
        best = max(best, current);
    }
    return  best;
}
A

5

B

6

C

7

D

8

第 15 题

数组 a 和 b 按低位在前的顺序保存两个非负大整数。下面代码实现高精度加法,横线处应填写( )。

vector<int> add(const vector<int> &a, const vector<int> &b) {
    vector<int> c;
    int carry = 0;
    int n = max(a.size(), b.size());

    for (int i = 0; i < n; i++) {
        int sum = carry;
        if (i < a.size())
            sum += a[i];
        if (i < b.size())
            sum += b[i];
        c.push_back(sum % 10);
        ____________________
    }
    if (carry)
        c.push_back(carry);
    return c;
}
A

carry = sum % 10;

B

carry = sum;

C

carry = sum / 10;

D

carry = c[i] / 10;

单选题部分已到底了。

小程序开心码未来

微信扫码,随时随地练 GESP 真题

  • 手机刷题 · 自动判分,错题自动归档到错题本
  • 绑定网站账号后,查看答案解析等权限自动同步
开心码未来小程序二维码(微信扫一扫) 微信扫一扫