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

GESP C++ 5级 2024.06

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

下面 C++ 代码用于求斐波那契数列,该数列第 11、22 项为 11,以后各项均是前两项之和。函数 fibo() 属于( )。

int fibo(int n) {
 if (n <= 0)
 return 0;
 if (n == 1 || n == 2)
 return 1;
 
 int a = 1, b = 1, next;
 for (int i = 3; i <= n; i++) {
 next = a + b;
 a = b;
 b = next;
 }
 return next;
}
A

枚举算法

B

贪心算法

C

迭代算法

D

递归算法

2
单选题号 #12295
分值 2

下面 C++ 代码用于将输入金额换成最少币种组合方案,其实现算法是( )。

#include 
using namespace std;
#define N_COINS 7
int coins[N_COINS] = {100, 50, 20, 10, 5, 2, 1}; //货币面值,单位相同
int coins_used[N_COINS];
void find_coins(int money) {
 for (int i = 0; i > money; //输入要换算的金额
 find_coins(money);
 
 for (int i = 0; i < N_COINS; i++)
 cout << coins_used[i] << endl;
 
 return 0;
}
A

枚举算法

B

贪心算法

C

迭代算法

D

递归算法

3
单选题号 #12296
分值 2

小杨采用如下双链表结构保存他喜欢的歌曲列表:

struct dl_node {
 string song;
 dl_node* next;
 dl_node* prev;
};

小杨想在头指针为 headhead 的双链表中查找他喜欢的某首歌曲,采用如下查询函数,该操作的时间复杂度为( )。

dl_node* search(dl_node* head, string my_song) {
 dl_node* temp = head;
 while (temp != nullptr) {
 if (temp->song == my_song)
 return temp;
 temp = temp->next;
 }
 return nullptr;
}
A

O(1)O(1)

B

O(n)O(n)

C

O(log⁡n)O(\log n)

D

O(n2)O(n^2)

4
单选题号 #12297
分值 2

小杨想在如上题所述的双向链表中加入一首新歌曲。为了能快速找到该歌曲,他将其作为链表的第一首歌曲,则下面横线上应填入的代码为( )。

void insert(dl_node *head, string my_song) {
 p = new dl_node;
 p->song = my_song;
 p->prev = nullptr;
 p->next = head;

 if (head != nullptr) {
 ________________________________ // 在此处填入代码
 }
 head = p;
}
A

head->next->prev = p;

B

head->next = p;

C

head->prev = p;

D

触发异常,不能对空指针进行操作。

5
单选题号 #12298
分值 2

下面是根据欧几里得算法编写的函数,它计算的是 aa 与 bb 的( )。

int gcd(int a, int b) {
 while (b != 0) {
 int temp = b;
 b = a % b;
 a = temp;
 }
 return a;
}
A

最小公倍数

B

最大公共质因子

C

最大公约数

D

最小公共质因子

6
单选题号 #12299
分值 2

欧几里得算法还可以写成如下形式:

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

下面有关说法,错误的是( )。

A

本题的 gcd() 实现为递归方式。

B

本题的 gcd() 代码量少,更容易理解其辗转相除的思想。

C

当 aa 较大时,本题的 gcd() 实现会多次调用自身,需要较多额外的辅助空间。

D

当 aa 较大时,相比上题中的 gcd() 的实现,本题的 gcd() 执行效率更高。

7
单选题号 #12300
分值 2

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

vector linear_sieve(int n) {
 vector is_prime(n + 1, true);
 vector primes;
 is_prime[0] = is_prime[1] = 0; //0和1两个数特殊处理
 for (int i = 2; i <= n; ++i) {
 if (is_prime[i]) {
 primes.push_back(i);
 }
 ________________________________ { // 在此处填入代码
 is_prime[i * primes[j]] = 0;
 if (i % primes[j] == 0) break;
 }
 }
 return primes;
}
A
for (int j = 0; j < primes.size() && i * primes[j] <= n; j++)
B
for (int j = 0; j <= sqrt(n) && i * primes[j] <= n; j++)
C
for (int j = 0; j <= n; j++)
D
for (int j = 1; j <= sqrt(n); j++)
8
单选题号 #12301
分值 2

上题代码的时间复杂度是( )

A

O(n2)O(n^2)

B

O(nlogn)O(nlogn)

C

O(nloglogn)O(nlog logn)

D

O(n)O(n)

9
单选题号 #12302
分值 2

为了正确实现快速排序,下面横线上的代码应为( )。

void qsort(vector& arr, int left, int right) {
 int i, j, mid;
 int pivot;

 i = left;
 j = right;
 mid = (left + right) / 2; // 计算中间元素的索引
 pivot = arr[mid]; // 选择中间元素作为基准值
 
 do {
 while (arr[i] pivot) j--;
 if (i <= j) {
 swap(arr[i], arr[j]); // 交换两个元素
 i++; j--;
 }
 } ________________________________; // 在此处填入代码
 if (left < j) qsort(arr, left, j); // 对左子数组进行快速排序
 if (i < right) qsort(arr, i, right); // 对右子数组进行快速排序
}
A

while (i <= mid)

B

while (i < mid)

C

while (i < j)

D

while (i <= j)

10
单选题号 #12303
分值 2

关于分治算法,以下哪个说法正确?

A

分治算法将问题分成子问题,然后分别解决子问题,最后合并结果。

B

归并排序不是分治算法的应用。

C

分治算法通常用于解决小规模问题。

D

分治算法的时间复杂度总是优于 O(nlog(n))O(nlog(n))。

🔒

已解锁前 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号

隐私政策服务条款