GESP 2025年6月_C++五级试卷

从PDF导入:GESP 2025年6月_C++五级试卷

C++ 180分钟 总分 100.0 27 题
试卷题目预览
第1题 中级 2.0分 单选
与数组相比,链表在( )操作上通常具有更高的效率。
A. 随机访问元素
B. 查找指定元素
C. 在已知位置插入或删除节点
D. 遍历所有元素
第2题 中级 2.0分 单选
下面C++代码实现双向链表。函数is_empty()判断链表是否为空,如链表为空返回true,否则返回false。横线处不能填写( )。

A. return head == nullptr;
B. return tail == nullptr;
C. return head.data == 0;
D. return size == 0;
第3题 中级 2.0分 单选
基于上题代码正确的前提下,填入相应代码完善append(),用于在双向链表尾部增加新节点,横线上应填写( )。

A. tail->next = newNode;
B. tail = newNode; newNode->prev = tail; tail->next = newNode;
C. tail->next = newNode; newNode->prev = tail; tail = newNode;
D. 以上都不对
第4题 中级 2.0分 单选
下列C++代码用循环链表解决约瑟夫问题,即假设n个人围成一圈,从第一个人开始数,每次数到第k个的人就出圈,输出最后留下的那个人的编号。横线上应填写( )。
A. prev->next = p->next; delete p; p = prev->next;
B. delete p; prev->next = p->next; p = prev->next;
C. delete p; p = prev->next; prev->next = p->next;
D. prev->next = p->next; p = prev->next; delete p;
第5题 中级 2.0分 单选
下列C++代码判断一个正整数是否是质数,说法正确的是( )。
A. 代码存在错误,比如5是质数,但因为5 % 5余数是0返回了false
B. finish_number的值应该是n / 2,当前写法将导致错误
C. 当前while循环正确的前提是:所有大于3的质数都符合6k±1形式
D. while循环修改为for循环,其执行效果和执行时间相同
第6题 中级 2.0分 单选
下列C++代码用两种方式求解两个正整数的最大公约数,说法错误的是( )。
A. gcd0()函数的时间复杂度为O(log n)
B. gcd1()函数的时间复杂度为O(n)
C. 一般说来,gcd0()的效率高于gcd1()
D. gcd1()中的代码for (int i = small; i >= 1; --i)应该修改为for (int i = small; i > 1; --i)
第7题 中级 2.0分 单选
下面的代码用于判断整数是否是质数,错误的说法是( )。
A. 埃氏筛算法相对于上面的代码效率更高
B. 线性筛算法相对于上面的代码效率更高
C. 上面的代码有很多重复计算,因为不是判断单个数是否为质数,故而导致筛选出连续数中质数的效率不高
D. 相对而言,埃氏筛算法比上面代码以及线性筛算法效率都高
第8题 中级 2.0分 单选
唯一分解定理描述了关于正整数的什么性质?
A. 任何正整数都可以表示为两个素数的和。
B. 任何大于1的合数都可以唯一分解为有限个质数的乘积。
C. 两个正整数的最大公约数总是等于它们的最小公倍数除以它们的乘积。
D. 所有素数都是奇数。
第9题 中级 2.0分 单选
下面的C++代码,用于求一系列数据中的最大值。有关其算法说法错误的是( )。

A. 该算法采用分治算法
B. 该算法是递归实现
C. 该算法采用贪心算法
D. 该算法不是递推算法
第10题 中级 2.0分 单选
下面的C++代码,用于求一系列数据中的最大值。有关其算法说法错误的是( )。

A. 本题find_max()函数采用的是迭代算法
B. 本题find_max()函数的时间复杂度为O(n)
C. 和上一题的find_max()相比,因为没有递归,所以没有栈的创建和销毁开销
D. 本题find_max()函数和上一题的find_max()空间复杂度相同
第11题 中级 2.0分 单选
下面的C++代码用于在升序数组lst中查找目标值target最后一次出现的位置。相关说法,正确的是( )。
A. 当lst中存在重复的target时,该函数总能返回最后一个target的位置,即便lst全由相同元素组成
B. 当target小于lst中所有元素时,该函数会返回0
C. 循环条件改为while (low <= high)程序执行效果相同,且能提高准确性
D. 将代码中(low + high + 1) / 2修改为(low + high) / 2效果相同
第12题 中级 2.0分 单选
有关下面C++代码的说法,错误的是( )。
A. "阶段1"的目标是寻找正整数n可能的正完全平方根
B. "阶段2"的目标是如果正整数n没有正完全平方根,则在可能产生完全平方根附近寻找带小数点的平方根
C. 代码check_int = (long long)(result + 0.5)是检查因浮点误差是否为正完全平方根
D. 阶段2的二分法中high_d - low_d >= epsilon不能用于浮点数比较,会进入死循环
第13题 中级 2.0分 单选
硬币找零问题中要求找给客户最少的硬币。coins存储可用硬币规格,单位为角,假设规格都小于10角,且一定有1角规格。amount为要找零的金额,约定必须为1角的
A. 上述代码采用贪心算法实现
B. 针对本题具体要求,上述代码总能找到最优解
C. 上述代码采用枚举算法
D. 上述代码采用分治算法
第14题 中级 2.0分 单选
关于下述C++代码的快速排序算法,说法错误的是( )。
A. 在randomPartition函数中,变量i的作用是记录大于基准值的元素的边界
B. randomPartition函数随机选择基准值,可以避免输入数据特定模式导致的最坏情况下时间复杂度O(n²)
C. 快速排序平均时间复杂度是O(n log n)
D. 快速排序是稳定排序算法
第15题 中级 2.0分 单选
小杨编写了一个如下的高精度除法函数,则横线上应填写的代码为( )。
A. r.d[0] = a.d[i]; r.len++;
B. r.d[i] = a.d[i]; r.len++;
C. r.d[i] = a.d[i]; r.len = 1;
D. r.d[0] = a.d[i]; r.len = 1;
第16题 中级 2.0分 判断
下面C++代码是用欧几里得算法(辗转相除法)求两个正整数的最大公约数,a大于b还是小于b都适用。

T. 正确
F. 错误
第17题 中级 2.0分 判断
假设函数gcd()函数能正确求两个正整数的最大公约数,则下面的lcm()函数能求相应两数的最小公倍数。

T. 正确
F. 错误
第18题 中级 2.0分 判断
下面的C++代码用于输出每个数对应的质因数列表。
T. 正确
F. 错误
第19题 中级 2.0分 判断
下面的C++代码实现归并排序。代码在执行时,将输出一次HERE字符串,因为merge()函数仅被调用一次。
T. 正确
F. 错误
第20题 中级 2.0分 判断
归并排序的最好、最坏和平均时间复杂度均为O(n log n)。
T. 正确
F. 错误
第21题 中级 2.0分 判断
查字典这个小学生必备技能,可以把字典视为一个已排序的数组。这种查字典的一系列操作可看作二分查找。
T. 正确
F. 错误
第22题 中级 2.0分 判断
求解最短路径问题常用Dijkstra算法,从算法的描述可以看出,Dijkstra算法是贪心算法。
T. 正确
F. 错误
第23题 中级 2.0分 判断
分治算法将原问题可以分解成规模更小的子问题,但由于分治算法需要将问题进行分解,所以分治算法的效率通常比直接求解原问题的效率低。
T. 正确
F. 错误
第24题 中级 2.0分 判断
函数puzzle定义如下,则调用puzzle(7)程序会无限递归。

T. 正确
F. 错误
第25题 中级 2.0分 判断
如下为线性筛法,用于高效生成素数表,其核心思想是每个合数只被它的最小质因数筛掉一次,时间复杂度为O(n)。
T. 正确
F. 错误
第26题 中级 25.0分 编程
奖品兑换

班主任给上课专心听讲、认真完成作业的同学们分别发放了若干张课堂优秀券和作业优秀券。同学们可以使用这两种券找班主任兑换奖品。具体来说,可以使用a张课堂优秀券和b张作业优秀券兑换一份奖品,或者使用c张课堂优秀券和d张作业优秀券兑换一份奖品。 现在小A有n张课堂优秀券和m张作业优秀券,他最多能兑换多少份奖品呢?

【输入格式】
第一行,两个正整数n, m,分别表示小A持有的课堂优秀券和作业优秀券的数量。
第二行,两个正整数a, b,表示兑换一份奖品所需的两种券的数量。
【输出格式】
输出共一行,一个整数,表示最多能兑换的奖品份数。
【样例输入】

8 8
2 1
【样例输出】

5
对于50%的测试点,保证n,m<=1000,a,b<=100。
对于所有测试点,保证1<=n,m<=10^9,1<=a,b<=10^5。
第27题 中级 25.0分 编程
最大公因数

对于两个正整数x,y,它们的最大公因数记为gcd(x,y)。对于n个正整数a1,a2,...,an,它们的最大公因数为:gcd(a1,a2,...,an) = gcd(gcd(...gcd(gcd(a1,a2),a3)...),an)。 给定n个正整数a1,a2,...,an以及q组询问。对于第i(1<=i<=q)组询问,请求出gcd(a1+i, a2+i, ..., an+i)。

【输入格式】
第一行,两个正整数n, q,分别表示给定正整数的数量,以及询问组数。
第二行,n个正整数a1,a2,...,an。
【输出格式】
输出共q行,第i行包含一个正整数,表示gcd(a1+i, a2+i, ..., an+i)。
【样例输入】

5 3
6 9 12 18 30
【样例输出】

1
3
1
对于50%的测试点,保证n,q<=5000,ai,q<=10^4。
对于所有测试点,保证n,q<=10^5,1<=ai<=10^9,1<=q<=10^5。
💬