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

GESP C++ 5级 2026.06

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

假设 head != nullptr ,下面是实现单向循环链表在头节点后插入新节点的代码,横线处应填入( )。

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

void insertAfterHead(Node* head, int x) {
 Node* newNode = new Node;
 newNode->val = x;
 ______________________ // 在此处填入代码
}
A
newNode->next = head; head->next = newNode;
B
newNode->next = head->next; 
head->next = newNode;
C
head->next = newNode; 
newNode->next = head->next;
D
newNode->next = head->next; 
head = newNode;
2
单选题号 #10540
分值 2

下面代码遍历并输出一个循环单链表,其中 head 指向链表的第一个节点,横线处应填入的是( )。

struct Node {
 int val;
 Node* next;
};
void printList(Node* head) {
 if (head == nullptr) return;
 Node* p = head;
 _______________________ // 在此处填入代码
 cout << endl;
}
A
while (p != nullptr) {
 cout val next;
}
B
while (p->next != nullptr) {
 cout val next;
}
C
do {
 cout val next;
} while (p != head);
D
for (; p; p = p->next) {
 cout val << " ";
}
3
单选题号 #10541
分值 2

双链表结点定义如下,若要删除双链表中的中间结点(非首尾节点) p ,下面写法正确的是( )。

struct Node {
 int val;
 Node* prev;
 Node* next;
};
A
p->prev->next = p->next;
p->next->prev = p->prev;
delete p;
B
p->next->prev = p->next;
p->prev->next = p->prev;
delete p;
C
p->prev = p->next;
p->next = p->prev;
delete p;
D
p->next->next = p->prev;
p->prev->prev = p->next;
delete p;
4
单选题号 #10542
分值 2

使用如下欧几里得算法求 gcd(105, 45) 时,函数 gcd(a, b) 的递归调用序列正确的是 ( )

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

gcd(105, 45) -> gcd(45, 60) -> gcd(60, 15) -> gcd(15, 0)

B

gcd(105, 45) -> gcd(45, 15) -> gcd(15, 0)

C

gcd(105, 45) -> gcd(60, 45) -> gcd(15, 45)

D

gcd(105, 45) -> gcd(15, 45) -> gcd(15, 0)

5
单选题号 #10543
分值 2

下面代码实现线性筛(欧拉筛),以筛选出 nn 以内的所有素数。横线处的代码应为 ( )。

vector sieve(int n) {
 vector is_prime(n + 1, true);
 vector primes;
 if (n >= 0) is_prime[0] = false;
 if (n >= 1) is_prime[1] = false;

 for (int i = 2; i <= n; ++i) {
 if (is_prime[i]) {
 primes.push_back(i);
 }
 for (int j = 0; j < primes.size() && i * primes[j] <= n; j++) {
 is_prime[i * primes[j]] = false;
 if (________________) break; // 在此处填入代码
 }
 }
 return primes;
}
A

i % primes[j] == 0

B

primes[j] % i == 0

C

i % primes[j] != 0

D

i == primes[j]

6
单选题号 #10544
分值 2

下面关于埃氏筛法的说法正确的是( )。

A

每个合数只会被筛掉一次

B

从每个素数出发,把它的倍数标记为合数。

C

只能判断一个数是不是偶数

D

不能求出素数表

7
单选题号 #10545
分值 2

下面代码实现了计算 xnx^n 的快速幂算法,该算法体现的编程思想是( )

long long power(long long x, int n) {
 if (n == 0) return 1;
 long long res = power(x, n / 2);
 if (n % 2 == 0) return res * res;
 else return res * res * x;
}
A

枚举

B

贪心

C

分治

D

模拟

8
单选题号 #10546
分值 2

下面代码用于统计 nn 中因子 22 出现了多少次。若 n=40n = 40 ,输出是( )

int n = 40;
int cnt = 0;
while (n % 2 == 0) {
 cnt++;
 n /= 2;
}
cout << cnt;
A

11

B

22

C

33

D

44

9
单选题号 #10547
分值 2

在一个有序数组中查找第一个大于或等于 xx 的元素位置,横线处应填写( )。

int lowerBound(vector& a, int x) {
 int l = 0, r = a.size();
 while (l = x) ________________; // 在此处填入代码
 else l = mid + 1;
 }
 return l;
}
A

r = mid + 1

B

r = mid - 1

C

r = mid

D

l = mid

10
单选题号 #10548
分值 2

有若干根木头,长度存于 wood 。每切一刀可以把一段木头分成两段。函数 check(wood, K, x) 返回:
用不超过 K 刀,能否使所有木段长度都不超过 x 。下面代码使用二分答案查找最小可行的 x ,横线处应填( )。

int binary_cut(vector& wood, int K) {
 int l = 1;
 int r = 0;
 for (int len : wood) r = max(r, len);
 while (l < r) {
 int mid = l + (r - l) / 2;
 if (check(wood, K, mid))
 ________________; // 在此处填入代码
 else l = mid + 1;
 }
 return l;
}
A

r = mid + 1;

B

r = mid;

C

l = mid;

D

r = mid - 1;

🔒

已解锁前 10 题

第 11~27 题(共 17 题)需开通题库会员或使用积分包作答
本卷为 VIP 试卷:需开通题库会员(无限刷)或购买积分包(每题 1 积分);已购长期正课学员自动享有权益
海小星AI平台海小星AI平台

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

课程方向

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

联系我们

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

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

隐私政策服务条款