信奥刷题站
GESP 认证 5级2025-03

2025年3月 GESP C++ 5级

题量
27 题
客观题
25 题
建议时长
60 分钟
卷面总分
100 分

2025年3月 GESP C++ 5级认证考试真题(含编程操作题部分)

开始整卷模拟计时作答 · 交卷即时判分 · 错题自动进错题本(需登录)2 道编程大题:在线只判客观题,编程题请自行前往洛谷等 OJ 提交验证

// questions

题目预览

1
单选题2

链表不具备的特点是( )。

A

可随机访问任何一个元素

B

插入、删除操作不需要移动元素

C

无需事先估计存储空间大小

D

所需存储空间与存储元素个数成正比

2
单选题2

双向链表中每个结点有两个指针域 prevnext ,分别指向该结点的前驱及后继结点。设 ppp 指向链表中的一个结点,它的前驱结点和后继结点均非空。要删除结点 ppp ,则下述语句中错误的是( )。

A
p->next->prev = p->next;
p->prev->next = p->prev;
delete p;
B
p->prev->next = p->next;
p->next->prev = p->prev;
delete p;
C
p->next->prev = p->prev;
p->next->prev->next = p->next;
delete p;
D
p->prev->next = p->next;
p->prev->next->prev = p->prev;
delete p;
3
单选题2

假设双向循环链表包含头尾哨兵结点(不存储实际内容),分别为 headheadheadtailtailtail,链表中每个结点有两个指针域 prevprevprevnextnextnext,分别指向该结点的前驱及后继结点。下面代码实现了一个空的双向循环链表,横线上应填的最佳代码是( )。

// 链表结点
template <typename T>
struct ListNode {
    T data;
    ListNode* prev;
    ListNode* next;
    // 构造函数
    explicit ListNode(const T& val = T())
    : data(val), prev(nullptr), next(nullptr) {}
};
struct LinkedList {
    ListNode<T>* head;
    ListNode<T>* tail;
};
void InitLinkedList(LinkedList* list) {
    list->head = new ListNode<T>;
    list->tail = new ListNode<T>;
    ________________________________ // 在此处填入代码
};
A
list->head->prev = list->head;
list->tail->prev = list->head;
B
list->head->next = list->tail;
list->tail->prev = list->head;
C
list->head->next = list->tail;
list->tail->next = list->head;
D
list->head->next = list->tail;
list->tail->next = nullptr;
4
单选题2

用以下辗转相除法(欧几里得算法)求 gcd⁡(84,60)\gcd(84, 60)gcd(84,60) 的步骤中,第二步计算的数是( )。

int gcd(int a, int b) {
    int big = a > b ? a : b;
    int small = a < b ? a : b;
    if (big % small == 0) {
        return small;
    }
    return gcd(small, big % small);
}
A

848484606060

B

606060242424

C

242424121212

D

121212000

5
单选题2

根据唯一分解定理,下面整数的唯一分解是正确的( )。

A

18=3×618 = 3 \times 618=3×6

B

28=4×728 = 4 \times 728=4×7

C

36=2×3×636 = 2 \times 3 \times 636=2×3×6

D

30=2×3×530 = 2 \times 3 \times 530=2×3×5

6
单选题2

下述代码实现素数表的线性筛法,筛选出所有小于等于 nnn 的素数,横线上应填的最佳代码是( )。

vector<int> sieve_linear(int n) {
    vector<bool> is_prime(n + 1, true);
    vector<int> primes;
    if (n < 2) return primes;
    is_prime[0] = is_prime[1] = false;
    for (int i = 2; i <= n / 2; i++) {
        if (is_prime[i])
            primes.push_back(i);
        for (int j = 0; ________________________________ ; j++) { // 在此处填入代码
            is_prime[i * primes[j]] = false;
            if (i % primes[j] == 0)
                break;
        }
    }
    for (int i = n / 2 + 1; i <= n; i++) {
        if (is_prime[i])
            primes.push_back(i);
    }
    return primes;
}
A

j < primes.size()

B

i * primes[j] <= n

C

j < primes.size() && i * primes[j] <= n

D

j <= n

7
单选题2

在程序运行过程中,如果递归调用的层数过多,会因为( )引发错误。

A

系统分配的栈空间溢出

B

系统分配的堆空间溢出

C

系统分配的队列空间溢出

D

系统分配的链表空间溢出

8
单选题2

对下面两个函数,说法错误的是( )。

int factorialA(int n) {
    if (n <= 1) return 1;
    return n * factorialA(n-1);
}
int factorialB(int n) {
    if (n <= 1) return 1;
    int res = 1;
    for(int i=2; i<=n; i++)
        res *= i;
}
A

两个函数的实现的功能相同。

B

两个函数的时间复杂度均为 O(n)O(n)O(n)

C

factorialA 采用递归方式。

D

factorialB 采用递归方式。

9
单选题2

下算法中,( )是不稳定的排序。

A

选择排序

B

插入排序

C

归并排序

D

冒泡排序

10
单选题2

考虑以下 C++ 代码实现的快速排序算法,将数据从小到大排序,则横线上应填的最佳代码是( )。

int partition(vector<int>& arr, int low, int high) {
    int pivot = arr[high]; // 基准值
    int i = low - 1;
    for (int j = low; j < high; j++) {
        ________________________________ // 在此处填入代码
    }
    swap(arr[i + 1], arr[high]);
    return i + 1;
}
// 快速排序
void quickSort(vector<int>& arr, int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high);
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}
A
if (arr[j] > pivot) {
    i++;
    swap(arr[i], arr[j]);
}
B
if (arr[j] < pivot) {
    i++;
    swap(arr[i], arr[j]);
}
C
if (arr[j] < pivot) {
    swap(arr[i], arr[j]);
    i++;
}
D
if (arr[j] == pivot) {
    i++;
    swap(arr[i], arr[j]);
}
11
单选题2

若用二分法在 [1,100][1, 100][1,100] 内猜数,最多需要猜( )次。

A

100100100

B

101010

C

777

D

555

12
单选题2

下面代码实现了二分查找算法,在数组 arr 找到目标元素 target 的位置,则横线上能填写的最佳代码是( )。

int binarySearch(int arr[], int left, int right, int target) {
    while (left <= right) {
        ________________________________ // 在此处填入代码
        if (arr[mid] == target)
            return mid;
        else if (arr[mid] < target)
            left = mid + 1;
        else
            right = mid - 1;
    }
    return -1;
}
A

int mid = left + (right - left) / 2;

B

int mid = left;

C

int mid = (left + right) / 2;

D

int mid = right;

13
单选题2

贪心算法的核心特征是( )。

A

总是选择当前最优解

B

回溯尝试所有可能

C

分阶段解决子问题

D

总能找到最优解

14
单选题2

函数 int findMax(int arr[], int low, int high) 计算数组中最大元素,其中数组 arr 从索引 lowlowlowhighhighhigh,( )正确实现了分治逻辑。

A
if (low == high)
    return arr[low];
int mid = (low + high) / 2;
return arr[mid];
B
if (low >= high)
    return arr[low];
int mid = (low + high) / 2;
int leftMax = findMax(arr, low, mid - 1);
int rightMax = findMax(arr, mid, high);
return leftMax + rightMax;
C
if (low > high)
    return 0;
int mid = low + (high - low) / 2;
int leftMax = findMax(arr, low, mid);
int rightMax = findMax(arr, mid + 1, high);
return leftMax * rightMax;
D
if (low == high)
    return arr[low];
int mid = low + (high - low) / 2;
int leftMax = findMax(arr, low, mid);
int rightMax = findMax(arr, mid + 1, high);
return (leftMax > rightMax) ? leftMax : rightMax;
15
单选题2

小杨编写了一个如下的高精度乘法函数,则横线上应填写的代码为( )。

vector<int> multiply(vector<int>& a, vector<int>& b) {
    int m = a.size(), n = b.size();
    vector<int> c(m + n, 0);
    // 逐位相乘,逆序存储
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            c[i + j] += a[i] * b[j];
        }
    }
    // 处理进位
    int carry = 0;
    for (int k = 0; k < c.size(); ++k) {
        ________________________________ // 在此处填入代码
        c[k] = temp % 10;
        carry = temp / 10;
    }
    while (c.size() > 1 && c.back() == 0)
        c.pop_back();
    return c;
}
A

int temp = c[k];

B

int temp = c[k] + carry;

C

int temp = c[k] - carry;

D

int temp = c[k] * carry;

16
判断题2

要删除单链表中某个结点 p (非尾结点),但不知道头结点,可行的操作是将 p->next 的数据拷贝到 p 的数据部分,将 p->next 设置为 p->next->next,然后删除 p->next

17
判断题2

链表存储线性表时要求内存中可用存储单元地址是连续的。

18
判断题2

线性筛相对于埃拉托斯特尼筛法,每个合数只会被它的最小质因数筛去一次,因此效率更高。

19
判断题2

贪心算法通过每一步选择当前最优解,从而一定能获得全局最优解。

20
判断题2

递归函数必须具有一个终止条件,以防止无限递归。

21
判断题2

快速排序算法的时间复杂度与输入是否有序无关,始终稳定为 O(nlog⁡n)O(n \log n)O(nlogn)

22
判断题2

归并排序算法的时间复杂度与输入是否有序无关,始终稳定为 O(nlog⁡n)O(n \log n)O(nlogn)

23
判断题2

二分查找适用于对无序数组和有序数组的查找。

24
判断题2

小杨有 100100100 元去超市买东西,每个商品有各自的价格,每种商品只能买 111 个,小杨的目标是买到最多数量的商品。小杨采用的策略是每次挑价格最低的商品买,这体现了分治思想。

25
判断题2

归并排序算法体现了分治算法,每次将大的待排序数组分成大小大致相等的两个小数组,然后分别对两个小数组进行排序,最后对排好序的两个小数组合并成有序数组。

GESP 编程操作题
26
编程题25

试题名称:平均分配

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

题目描述

小 A 有 2n2n2n 件物品,小 B 和小 C 想从小 A 手上买走这些物品。对于第 iii 件物品,小 B 会以 bib_ibi 的价格购买,而小 C 会以 cic_ici 的价格购买。为了平均分配这 2n2n2n 件物品,小 A 决定小 B 和小 C 各自只能买走恰好 nnn 件物品。你能帮小 A 求出他卖出这 2n2n2n 件物品所能获得的最大收入吗?

输入格式

第一行,一个正整数 nnn

第二行,2n2n2n 个整数 b1,b2,…,b2nb_1,b_2,\dots,b_{2n}b1,b2,,b2n

第三行,2n2n2n 个整数 c1,c2,…,c2nc_1,c_2,\dots,c_{2n}c1,c2,,c2n

输出格式

一行,一个整数,表示答案。

样例输入 #1

3
1 3 5 6 8 10
2 4 6 7 9 11

样例输出 #1

36

样例输入 #2

2
6 7 9 9
1 2 10 12

样例输出 #2

35

说明/提示

数据范围

对于 20%20\%20% 的测试点,保证 1≤n≤81\le n\le81n8

对于另外 20%20\%20% 的测试点,保证 0≤bi≤10\le b_i\le10bi10≤ci≤10\le c_i\le10ci1

对于所有测试点,保证 1≤n≤1051\le n\le10^51n1050≤bi≤1090\le b_i\le10^90bi1090≤ci≤1090\le c_i\le10^90ci109

本题为编程大题:请复制题面到洛谷 / GESP OJ 等平台编写并提交代码(本站不判分)
27
编程题25

试题名称:原根判断

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

题目描述

小 A 知道,对于质数 ppp 而言,ppp 的原根 ggg 是满足以下条件的正整数:

  • 1<g<p1<g<p1<g<p
  • gp−1 mod p=1g^{p-1}\bmod{p}=1gp1modp=1
  • 对于任意 1≤i<p−11\le i<p-11i<p1 均有 gi mod p≠1g^i\bmod{p}\neq1gimodp=1

其中 a mod pa\bmod{p}amodp 表示 aaa 除以 ppp 的余数。

小 A 现在有一个整数 aaa,请你帮他判断 aaa 是不是 ppp 的原根。

输入格式

第一行,一个正整数 TTT,表示测试数据组数。

每组测试数据包含一行,两个正整数 a,pa,pa,p

输出格式

对于每组测试数据,输出一行,如果 aaappp 的原根则输出 Yes,否则输出 No

样例输入 #1

3
3 998244353
5 998244353
7 998244353

样例输出 #1

Yes
Yes
No

说明/提示

数据范围

对于 40%40\%40% 的测试点,保证 3≤p≤1033\le p\le10^33p103

对于所有测试点,保证 1≤T≤201\le T\le201T203≤p≤1093\le p\le10^93p1091<a<p1<a<p1<a<pppp 为质数。

本题为编程大题:请复制题面到洛谷 / GESP OJ 等平台编写并提交代码(本站不判分)