今天为大家带来的是2023年12月认证C++ 五级真题解析回顾。
CCF编程能力等级认证,英文名Grade Examination of Software Programming(以下简称GESP),由中国计算机学会发起并主办,是为青少年计算机和编程学习者提供学业能力验证的平台。GESP覆盖中小学全学段,符合条件的青少年均可参加认证。GESP旨在提升青少年计算机和编程教育水平,推广和普及青少年计算机和编程教育。
GESP考察语言为图形化编程、Python编程及C++编程,主要考察学生掌握相关编程知识和操作能力,熟悉编程各项基础知识和理论框架,通过设定不同等级的考试目标,让学生具备编程从简单的程序到复杂程序设计的编程能力,为后期专业化编程学习打下良好基础。
本次为大家带来的是2023年12月份C++ 五级认证真题解析。
一、单选题(每题2分,共30分)

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

A. fiboA( ) ⽤递归⽅式,fiboB() 循环⽅式
B. fiboA( ) 更加符合斐波那契数列的数学定义,直观易于理解,⽽fiboB() 需要将数学定义转换为计算机程序实现
C. fiboA( ) 不仅仅更加符合数学定义,直观易于理解,且因代码量较少执⾏效率更⾼
D. fiboB( ) 虽然代码量有所增加,但其执⾏效率更⾼
【答案】C
【考纲知识点】算法知识点
【解析】fiboA是很好理解的,但是执行效率不高,有的计算是重复的,导致效率低。
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)
【答案】C
【考纲知识点】算法知识点
【解析】本题考察归并排序。归并排序需要先将排序序列一分为二,左边的元素的区间是[s,m],右边元素区间是[m+1,t],然后递归排序两个子序列后,将有序的子序列合并。
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
【答案】D
【考纲知识点】算法知识点
【解析】本题考察递归算法。输出fracA函数,是先输出1,再输出5的阶乘,120;23行代码,执行fracB函数,此时stepCount从2开始计数,依次输出2/3/4/5/6,再输出5的阶乘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]
【答案】A
【考纲知识点】排序算法知识点
【解析】本题考察排序算法。前一个数字,下标是j的数字是偶数,后面的数字下标是j+1的是奇数,按照要求,偶数在奇数的后面,要交换。A符合题意条件。
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. 触发异常 ,不能对空指针进⾏操作。
【答案】B
【考纲知识点】指针知识点
【解析】本题考察双链表知识点。每个节点需要2个指针,指向前驱节点和后继节点。按照要求,新的节点要求插入到链表头部。头节点和新插入的节点都需要修改。B选项能够完成新节点的插入。
6、有关下⾯C++代码说法正确的是( )。

A. 如果x⼩于10, rc值也不会超过20
B. foo可能⽆限递归
C. foo可以求出x和 y的最⼤公共质因⼦
D. foo能够求出x和 y的最⼩公倍数
【答案】A
【考纲知识点】数学知识点
【解析】本题考察数学算法,求最大公约数。这是典型的最大公约数写法的变形。排除法选A。
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)
【答案】C
【考纲知识点】排序算法知识点
【解析】本题考察快速排序。Less数组保存的是小于等于pivot,然后加上pivot元素,再加上大于等于pivot的数组。
8、下⾯C++代码中的 isPrimeA() 和 isPrimeB() 都⽤于判断参数N是否素数 ,有关其时间复杂度的正确说法是( )。


【答案】B
【考纲知识点】数学知识点
【解析】本题考察数学知识,判断质数。A函数时间复杂度是O(n/2),B函数算法是O(sqrt(n)),大部分情况后者是优的,值更小。
9、下⾯C++代码⽤于有序 list 的⼆分查找 ,有关说法错误的是( )。

A. 代码采⽤⼆分法实现有序 list 的查找
B. 代码采⽤分治算法实现有序 list 的查找
C. 代码采⽤递归⽅式实现有序 list 的查找
D. 代码采⽤动态规划算法实现有序 list 的查找
【答案】D
【考纲知识点】算法知识点
【解析】本题考察算法知识点。二分法每次规模减半,查找平均时间复杂度是B。
10、在上题的_binarySearch算法中,如果l st中有N个元素,其时间复杂度是( )。
A. O(N)
B. 0(logN)
C. o(NlogN)
D. 0(N2)
【答案】B
【考纲知识点】算法知识点
【解析】本题考察算法知识点。二分法每次规模减半,单词查找平均时间复杂度是B。
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;
【答案】D
【考纲知识点】算法知识点
【解析】本题考察高精度知识点。每次保存对应位和的最低位数字,去掉最低位数字后,保持进位,循环执行。
12、有关下⾯C++代码的说法正确的是( )。

A. 上述代码构成单向链表
B. 上述代码构成双向链表
C. 上述代码构成循环链表
D. 上述代码构成指针链表
【答案】B
【考纲知识点】链表知识点
【解析】本题考察链表知识点。每个节点指向自己前一个节点和后一个节点,因此是双向链表。
13、通讯卫星在通信⽹络系统中主要起到() 的作⽤ 。
A. 信息过滤
B. 信号中继
C. 避免攻击
D. 数据加密
【答案】B
【考纲知识点】计算机基础知识
【解析】本题考察计算机基础知识。通信卫星可以转发无线电信号,实现通信地球站间或地球站与航天器间的无线电通信,因此具有信号中继作用。选B。
14、⼩杨想编写⼀个判断任意输⼊的整数N是否为素数的程序 ,下⾯哪个⽅法不合适? ( )
A. 埃⽒筛法
B. 线性筛法
C. ⼆分答案
D. 枚举法
【答案】C
【考纲知识点】数学知识
【解析】本题考察数学知识。线筛和埃筛都可以判断素数,枚举也可以,二分规模减半,不能合理判断。
15、下⾯的排序算法都要处理多趟数据 ,哪种排序算法不能保证在下⼀趟处理时从待处理数据中选出最⼤或最 ⼩的数据? ( )
A. 选择排序
B. 快速排序
C. 堆排序
D. 冒泡排序
【答案】B
【考纲知识点】排序算法知识
【解析】本题考察排序算法知识。需要了解每种排序算法的特点。快速排序是选定一个数字,每次把比它小的放在左边,比元素大的放在右边,不能确定最值。
二、判断题(每题2分,共20分)

1、归并排序的时间复杂度是0(N logN) 。( )
【答案】正确
【考纲知识点】排序算法知识
【解析】本题考察排序算法知识。归并排序算法的时间复杂度的描述正确。
2、⼩杨在⽣⽇聚会时拿⼀块H*W的巧克⼒招待来的K个⼩朋友,保证每位⼩朋友⾄少能获得⼀块相同⼤⼩的巧克⼒ 。那么⼩杨想分出来最⼤边长的巧克⼒可以使⽤⼆分法。 ( )
【答案】错误
【考纲知识点】算法知识
【解析】因为考纲中对二分法同时列出了“二分查找”和“二分答案(或二分枚举)”。
3、以下C++代码能以递归⽅式实现斐波那契数列 ,该数列第1 、2项为1, 以后各项均是前两项之和 。( )

【答案】错误
【考纲知识点】算法知识
【解析】本题考察递归算法知识。递归函数要调用自己。
4、贪⼼算法可以达到局部最优 ,但可能不是全局最优解 。( )
【答案】正确
【考纲知识点】算法知识
【解析】本题考察贪心算法知识。贪心是局部达到最优。
5、⼩杨设计了⼀个拆数程序,它能够将任意的⾮质数⾃然数N转换成若⼲个质数的乘积,这个程序是可以设计出来的。( )
【答案】正确
【考纲知识点】数学知识
【解析】本题考察数学知识。素数分解定理规定:任何一个整数都可以被分解为一系列因子的乘积,乘积中所有的因子都是质数(即素数)。(更严谨一点:大于1的整数)
6、插⼊排序有时⽐快速排序时间复杂度更低 。 ( )
【答案】正确
【考纲知识点】排序知识
【解析】本题考察排序算法知识。当数据初始有序时,插入排序的最快时间复杂度是O(n),快排最坏时间复杂度是O(N2)。
7、下⾯的C++代码能实现⼗进制正整数N转换为⼋进制并输出 。 ( )

【答案】错误
【考纲知识点】计算机基础知识
【解析】本题考察进制转换知识。转换后的内容要倒序输出并以0开头。
8、对数组 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} 。 ( )
【答案】正确
【考纲知识点】排序知识
【解析】本题考察排序算法知识。sort默认是从小到大排序。
9、⼩杨想写⼀个程序来算出正整数N有多少个因数 ,经过思考他写出了⼀个重复没有超过N/2次的循环就能够算 出来了 。 ( )
【答案】正确
【考纲知识点】数学知识
【解析】本题考察数学知识。可以循环N的一半找到所有因数。
10、同样的整数序列分别保存在单链表和双向链中 ,这两种链表上的简单冒泡排序的复杂度相同。 ( )
【答案】正确
【考纲知识点】排序算法知识
【解析】本题考察排序算法知识。冒泡排序,相邻的数据交换,而且修改节点链的操作不会改变复杂度。
三、编程题(每题25分,共50分)

1、小杨的幸运数
问题描述
⼩杨认为,所有⼤于等于a的完全平⽅数都是他的超级幸运数。
⼩杨还认为,所有超级幸运数的倍数都是他的幸运数。⾃然地,⼩杨的所有超级幸运数也都是幸运数。
对于⼀个⾮幸运数,⼩杨规定,可以将它⼀直+1,直到它变成⼀个幸运数。我们把这个过程叫做幸运化。例如,如果a=4,那么4是最⼩的幸运数,⽽1不是,但我们可以连续对1做3次+1操作,使其变为4,所以我们可以说, 幸运化后的结果是 4。
现在,⼩样给出N个数,请你⾸先判断它们是不是幸运数;接着,对于⾮幸运数,请你将它们幸运化。
输入描述
第⼀⾏ 2 个正整数a,N。
接下来N ⾏ ,每⾏⼀个正整数x ,表⽰需要判断(幸运化) 的数。
输出描述
输出 N ⾏,对于每个给定的x ,如果它是幸运数,请输出 lucky ,否则请输出将其幸运化后的结果。
特别提醒
在常规程序中,输⼊ 、输出时提供提⽰是好习惯。但在本场考试中, 由于系统限定,请不要在输⼊、输出中附带任何提⽰信息。
样例输入1

样例输出1

样例解释1
1虽然是完全平⽅数,但它⼩于a, 因此它并不是超级幸运数,也不是幸运数。将其进⾏3次+1 操作后,最终得到幸运数 4。
4是幸运数,因此直接输lucky。
5不是幸运数,将其进⾏3次+1操作后,最终得到幸运数8。
9是幸运数,因此直接输出lucky。
样例输入2

样例输出2

数据规模
对于30%的测试点,保证 a,x≤ 100,N ≤ 100。
对于60%的测试点,保证a, x≤ 106
对于所有测试点,保证a ≤1,000,001; 保证 N ≤2x 105,保证1 ≤ x ≤1,000,001
【题目大意】给一个完全平方数的标准,推导出哪些是超级幸运数,然后判断N个数字中,哪些是超级幸运数,是的输出“lucky”,不是的输出离该数字最近的比它大的数字。
【考纲知识点】数学知识,埃筛知识,循环知识
【解题思路】完全平方数按照定义,包括1,4,9,16,25……。超级幸运数还可以是完全平方数的倍数,因此8,12,18……也是超级幸运数。数据范围比较大,1e6,用埃筛的模板,判断每一个数字是否是幸运数字。不是幸运数字的话,保留离它最近的幸运数字作为答案。最终完成整个查询。
【参考程序】
2、烹饪问题
问题描述
有N种⾷材,编号从0⾄N - 1,其中第 i 种⾷材的美味度为 ai 。
不同⾷材之间的组合可能产⽣奇妙的化学反应。具体来说,如果两种⾷材的美味度分别为x和y,那么它们的契合度为 x and y。其中,and 运算为按位与运算 ,需要先将两个运算数转换为⼆进制,然后在⾼位补⾜0,再逐位进⾏与运算。例如,12与6的⼆进制表⽰分别为1100和0110,将它们逐位进⾏与运算,得到 0100,转换为⼗进制得到4,因此12 and 6 = 4。在C++或Python中,可以直接使⽤&运算符表⽰与运算。
现在,请你找到契合度最⾼的两种⾷材,并输出它们的契合度。
输入描述
第⼀⾏⼀个整数N,表⽰⾷材的种数。
接下来⼀⾏N个⽤空格隔开的整数,依次为 a0,… ,aN-1,表⽰各种⾷材的美味度。
输出描述
输出一行一个整数,表示最高的契合度。
特别提醒
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。
样例输入1

样例输出1

样例解释1
可以编号为 1 , 2 的⾷材之间的契合度为 2 and 3 = 2 ,是所有⾷材两两之间最⾼的契合度。
样例输入2

样例输出2

样例解释 1
可以编号为 3 4 的⾷材之间的契合度为 10 and 13 = 8 ,是所有⾷材两两之间最⾼的契合度。
数据规模
对于40%的测试点 ,保证N ≤ 1 , 000;
对于所有测试点 ,保证 N ≤ 106 ,0 ≤ ai ≤ 2,147,483,647。
【题目大意】选出2个数字,求出这2个数字与操作的最大结果是多少。
【考纲知识点】位运算知识,循环知识,排序知识
【解题思路】需要选取2个数字,可以用双重循环枚举这2个数字,取最大值,最终得到答案。对于前40%的测试点是可以的。当数据量大的时候,就超时了。我们知道,两个数字对应的二进制,位数越高是1,越有可能是答案。所以从最高位统计,是否至少有2个数字最高位是1,保存最高位结果,并且把最高位非1的数字删去;再查询次高位是否至少有2个以上的数字二进制位都是1,以此类推,求出哪2个数字与 结果最大。利用快速排序的方法每次将剩余数字中当前考虑的位为1的数字放在前面,时间复杂度是 O(N*log(a_i值的最大值))。
【参考程序】
1. GESP微信:关注“CCF GESP”公众号,将问题以文字方式留言即可得到回复。
2. GESP邮箱:gesp@ccf.org.cn
注:请在邮件中详细描述咨询的问题并留下考生的联系方式及姓名、身份证号,以便及时有效处理。
3. GESP电话:0512-67656856
咨询时间:周一至周五(法定节假日除外): 上午 8:30-12:00;下午 13:00-17:30
GESP第五期认证报名已启动,扫描下方二维码,关注GESP公众号即可报名