image

编辑人: 沉寂于曾经

calendar2025-06-15

message1

visits898

2023年12月CCF-GESP编程能力等级认证C++编程五级真题参考答案

一、单选题

1、下面C++代码用于求斐波那契数列,该数列第1、2项为1,以后各项均是前两项之和。下面有关说法错误的是(   )。

A、

fiboA( ) 用递归方式, fiboB() 循环方式

B、

fiboA( ) 更加符合斐波那契数列的数学定义,直观易于理解,而 fiboB() 需要将数学定义转换为计算机程序实现

C、

fiboA( ) 不仅仅更加符合数学定义,直观易于理解,且因代码量较少执行效率更高

D、

fiboB( ) 虽然代码量有所增加,但其执行效率更高


2、下面C++代码以递归方式实现合并排序,并假设 merge (int T[], int R[], int s, int m, int t) 函数将有序(同样排序规则)的T[s..m]和T[m+1..t]归并到R[s..t]中。横线处应填上代码是(   )。

A、

mergeSort(SList, T2, s, m,len), mergeSort(SList, T2, m,t,len)

B、

mergeSort(SList, T2, s, m-1,len), mergeSort(SList, T2, m+1,t,len)

C、

mergeSort(SList, T2, s, m,len), mergeSort(SList, T2, m+1,t,len)

D、

mergeSort(SList, T2, s, m-1,len), mergeSort(SList, T2, m-1,t,len)


3、阅读下面的C++代码,执行后其输出是(   )。

A、

1->120<===>2->120

B、

1->120<===>1->120

C、

1->120<===>1->2->3->4->5->120

D、

1->120<===>2->3->4->5->6->120


4、下面的C++用于对 lstA 排序,使得偶数在前奇数在后,横线处应填入(   )。

A、

isEven(lstA[j]) && !isEven(lstA[j+1])

B、

!isEven(lstA[j]) && isEven(lstA[j+1])

C、

lstA[j] > lstA[j+1]

D、

lstA[j] < lstA[j+1]


5、下面的C++代码用于将字符串保存到带头节点的双向链表中,并对重复的串计数,然后将最新访问的串的节点放在链头便于查找。横线处应填入代码是(   )。

A、

if(pHead) {p->next = pHead->next, pHead->next->prev = p;}

B、

if(pHead->next) {p->next = pHead->next, pHead->next->prev = p;}

C、

p->next = pHead->next, pHead->next->prev = p;

D、

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


6、有关下面C++代码说法正确的是(   )。

A、

如果 x 小于10, rc 值也不会超过20

B、

foo 可能无限递归

C、

foo 可以求出 x 和 y 的最大公共质因子

D、

foo 能够求出 x 和 y 的最小公倍数


7、下面的C++代码实现对list的快速排序,有关说法,错误的是(   )。

A、

qSort(less) + qSort(greater) + (vector<int>)pivot

B、

(vector<int>)pivot + (qSort(less) + qSort(greater))

C、

(qSort(less) + (vector<int>)pivot + qSort(greater))

D、

qSort(less) + pivot + qSort(greater)


8、下面C++代码中的 isPrimeA() 和 isPrimeB() 都用于判断参数N是否素数,有关其时间复杂度的正确说法是(   )。

A、

isPrimeA( ) 的最坏时间复杂度是, isPrimeB( ) 的最坏时间复杂度是, isPrimeA() 优于 isPrimeB()

B、

isPrimeA() 的最坏时间复杂度是, isPrimeB( ) 的最坏时间复杂度是, isPrimeB() 绝大多数情况下优于 isPrimeA()

C、

isPrimeA() 的最坏时间复杂度是, isPrimeB( ) 的最坏时间复杂度是, isPrimeA( ) 优于isPrimeB( )

D、

isPrimeA() 的最坏时间复杂度是, isPrimeB( ) 的最坏时间复杂度是, isPrimeA() 优于isPrimeB( )


9、下面C++代码用于有序 list 的二分查找,有关说法错误的是(   )。

A、

代码采用二分法实现有序 list 的查找

B、

代码采用分治算法实现有序 list 的查找

C、

代码采用递归方式实现有序 list 的查找

D、

代码采用动态规划算法实现有序 list 的查找


10、在上题的 _binarySearch 算法中,如果 lst 中有 N 个元素,其时间复杂度是(   )。

A、

O(N)

B、

O(logN)

C、

O(NlogN)

D、

O(N2)


11、下面的C++代码使用数组模拟整数加法,可以处理超出大整数范围的加法运算。横线处应填入代码是(   )。

A、

c.push_back(t % 10), t = t % 10;

B、

c.push_back(t / 10), t = t % 10;

C、

c.push_back(t / 10), t = t / 10;

D、

c.push_back(t % 10), t = t / 10;


12、有关下面C++代码的说法正确的是(   )。(2023年12月C++五级)

A、

上述代码构成单向链表

B、

上述代码构成双向链表

C、

上述代码构成循环链表

D、

上述代码构成指针链表


13、通讯卫星在通信网络系统中主要起到(   )的作用。(2023年12月C++五级)

A 信息过滤

B 信号中继

C 避免攻击

D 数据加密


14、小杨想编写一个判断任意输入的整数N是否为素数的程序,下面哪个方法不合适?(   )(2023年12月C++五级)

A、

埃氏筛法

B、

线性筛法

C、

二分答案

D、

枚举法


15、下面的排序算法都要处理多趟数据,哪种排序算法不能保证在下一趟处理时从待处理数据中选出最大或最小的数据?(   )

A、

选择排序

B、

快速排序

C、

堆排序

D、

冒泡排序


二、判断题

16、归并排序的时间复杂度是O(NlogN)。(   )

A 正确

B 错误


17、小杨在生日聚会时拿一块H*W的巧克力招待来的K个小朋友,保证每位小朋友至少能获得一块相同大小的巧克力。那么小杨想分出来最大边长的巧克力可以使用二分法。(   )

A 正确

B 错误


18、以下C++代码能以递归方式实现斐波那契数列,该数列第1、2项为1,以后各项均是前两项之和。(   )

A 正确

B 错误


19、贪心算法可以达到局部最优,但可能不是全局最优解。 (   )

A 正确

B 错误


20、小杨设计了一个拆数程序,它能够将任意的非质数自然数N转换成若干个质数的乘积,这个程序是可以设计出来的。(   )

A 正确

B 错误


21、插入排序有时比快速排序时间复杂度更低。(   )(2023年12月C++五级)

A 正确

B 错误


22、下面的C++代码能实现十进制正整数N转换为八进制并输出。(   )

A 正确

B 错误


23、对数组 int arr[] = {2, 6, 3, 5, 4, 8, 1, 0, 9, 10} 执行 sort(arr, arr+10) ,则执行后 arr中的数据调整为 {0, 1, 2, 3, 4, 5, 6, 8,9, 10} 。(   )

A 正确

B 错误


24、小杨想写一个程序来算出正整数N有多少个因数,经过思考他写出了一个重复没有超过N/2次的循环就能够算出来了。(   )(2023年12月C++五级)

A 正确

B 错误


25、同样的整数序列分别保存在单链表和双向链中,这两种链表上的简单冒泡排序的复杂度相同。(   )(2023年12月C++五级)

A 正确

B 错误


三、实操题

26、小杨的幸运数

时间限制:1.0 s

内存限制:128.0 MB

问题描述

小杨认为,所有大于等于 的完全平方数都是他的超级幸运数。

小杨还认为,所有超级幸运数的倍数都是他的幸运数。自然地,小杨的所有超级幸运数也都是幸运数。

对于一个非幸运数,小杨规定,可以将它一直+1,直到它变成一个幸运数。我们把这个过程叫做幸运化。例如,如果a=4,那么4是最小的幸运数,而1不是,但我们可以连续对1做3次+1操作,使其变为4,所以我们可以说,1幸运化后的结果是4。

现在,小杨给出N个数,请你首先判断它们是不是幸运数;接着,对于非幸运数,请你将它们幸运化。

输入描述

第一行 2 个正整数a,N。

接下来N行,每行一个正整数x,表示需要判断(幸运化)的数。

输出描述

输出N行,对于每个给定的x,如果它是幸运数,请输出 lucky ,否则请输出将其幸运化后的结果。

特别提醒

在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。


样例输入 1

2 4
1
4
5
9

样例输出 1

4
lucky
8
lucky

样例解释 1

1虽然是完全平方数,但它小于a,因此它并不是超级幸运数,也不是幸运数。将其进行3次+1操作后,最终得到幸运数 。

4是幸运数,因此直接输出 lucky 。

5不是幸运数,将其进行3次+1操作后,最终得到幸运数8。

9是幸运数,因此直接输出 lucky 。


样例输入 2

16 11
1
2
4
8
16
32
64
128
256
512
1024

样例输出 2

16
16
16
16
lucky
lucky
lucky
lucky
lucky
lucky
lucky

数据规模

对于30%的测试点,保证a,x≤100,N≤100。

对于60%的测试点,保证a,x≤106

对于所有测试点,保证a≤1000001;保证N≤2×105;保证1≤x≤1000001。

参考答案:对于每个给定的x,先判断其是否为幸运数,若是,则直接输出“lucky”;若不是,则进行幸运化操作,直到变为幸运数。幸运化操作的方式为对x进行+1操作,直到x成为幸运数。


27、烹饪问题

时间限制:1.0 s

内存限制:128.0 MB

问题描述

有N种食材,编号从0至N-1,其中第 种食材的美味度为 。

不同食材之间的组合可能产生奇妙的化学反应。具体来说,如果两种食材的美味度分别为x和y,那么它们的契合度为x and y。

其中,and运算为按位与运算,需要先将两个运算数转换为二进制,然后在高位补足0,再逐位进行与运算。例如,12与6的二进制表示分别为 1100 和 0110 ,将它们逐位进行与运算,得到 0100 ,转换为十进制得到4,因此。在 C++ 或 Python 中,可以直接使用 & 运算符表示与运算。

现在,请你找到契合度最高的两种食材,并输出它们的契合度。

输入描述

第一行一个整数N,表示食材的种数。

接下来一行N个用空格隔开的整数,依次为a0,…,aN-1,表示各种食材的美味度。

输出描述

输出一行一个整数,表示最高的契合度。

特别提醒

在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。


样例输入 1

3
1 2 3

样例输出 1

2

样例解释 1

可以编号为1,2的食材之间的契合度为2 and 3=2,是所有食材两两之间最高的契合度。


样例输入 2

5
5 6 2 10 13

样例输出 2

8

样例解释 1

可以编号为3,4的食材之间的契合度为10 and 13=8,是所有食材两两之间最高的契合度。


数据规模

对于40%的测试点,保证N≤1000;

对于所有测试点,保证N≤106,0≤ai≤2147483647。

参考答案:对于每对食材,我们计算它们的契合度,然后找到其中最大的契合度输出即可。


喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:2023年12月CCF-GESP编程能力等级认证C++编程五级真题参考答案

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share