理论卷2025年3月GESP等级认证(C++) · 五级

GESP C++ 5级 2025.03

满分 100 · 及格 60 · 时长 60 分钟 · 共 27 题 (单选15 / 判断10 / 编程题2)
试卷阅览 · 免费预览前 10 题 · 交卷后可查看答案与解析
1
单选题号 #11619
分值 2

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

A

可随机访问任何一个元素

B

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

C

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

D

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

2
单选题号 #11620
分值 2

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

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
单选题号 #11621
分值 2

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

// 链表结点
template 
struct ListNode {
 T data;
 ListNode* prev;
 ListNode* next;

 // 构造函数
 explicit ListNode(const T& val = T())
 : data(val), prev(nullptr), next(nullptr) {}
};

struct LinkedList {
 ListNode* head;
 ListNode* tail;
};

void InitLinkedList(LinkedList* list) {
 list->head = new ListNode;
 list->tail = new ListNode;
 ________________________________ // 在此处填入代码
};
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
单选题号 #11622
分值 2

用以下辗转相除法(欧几里得算法)求 gcd(84,60)\text{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

8484 和 6060

B

6060 和 2424

C

2424 和 1212

D

1212 和 00

5
单选题号 #11623
分值 2

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

A

18=3×618 = 3\times6

B

28=4×728 = 4\times7

C

36=2×3×636 = 2\times3\times6

D

30=2×3×530 = 2\times3\times5

6
单选题号 #11624
分值 2

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

vector sieve_linear(int n) {
 vector is_prime(n +1, true);
 vector 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
单选题号 #11625
分值 2

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

A

系统分配的栈空间溢出

B

系统分配的堆空间溢出

C

系统分配的队列空间溢出

D

系统分配的链表空间溢出

8
单选题号 #11626
分值 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 *= n;
}
A

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

B

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

C

factorialA 采用递归方式。

D

factorialB 采用递归方式。

9
单选题号 #11627
分值 2

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

A

选择排序

B

插入排序

C

归并排序

D

冒泡排序

10
单选题号 #11628
分值 2

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

int partition(vector& arr, int low, int high) {
 int pivot = arr[high]; // 基准值
 int i = low - 1;

 for (int j = low; j & 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]);
}
🔒

已解锁前 10 题

第 11~27 题(共 17 题)可在考试中作答
本卷为普通试卷:注册用户每题扣 1 积分(每日登录送 30 体验积分),交卷后查看答案与解析
海小星AI平台海小星AI平台

点亮AI梦想,编程未来之星。专业的青少年AI编程教育平台。

课程方向

  • AIGC人工智能
  • Scratch图形化
  • Python编程
  • C++/NOIP竞赛

联系我们

  • 北京市西城区万博苑7号楼3层F28室
  • +86-010-83553010
  • contact@seanova.cn

© 2026 海小星AI平台|京ICP备2022032747号

隐私政策服务条款