2024年9月GESP编程能力认证C++等级考试五级真题(含答案和解析-在末尾)_第1页
2024年9月GESP编程能力认证C++等级考试五级真题(含答案和解析-在末尾)_第2页
2024年9月GESP编程能力认证C++等级考试五级真题(含答案和解析-在末尾)_第3页
2024年9月GESP编程能力认证C++等级考试五级真题(含答案和解析-在末尾)_第4页
2024年9月GESP编程能力认证C++等级考试五级真题(含答案和解析-在末尾)_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2024年9月GESP编程能力认证C++等级考试五级真题(含答案和解析-在末尾)一、单选题(每题2分,共30分)。1.下面关于链表和数组的描述,错误的是()。A.数组大小固定,链表大小可动态调整。B.数组支持随机访问,链表只能顺序访问。C.存储相同数目的整数,数组比链表所需的内存多。D.数组插入和删除元素效率低,链表插入和删除元素效率高。2.通过()操作,能完成在双向循环链表结点p之后插入结点s的功能(其中next域为结点的直接后继,prev域为结点的直接前驱)。3.对下面两个函数,说法错误的是()。intsumA(intn){intres=0;for(inti=1;i<=n;i++){res+=i;}returnres;}intsumB(intn){if(n==1)return1;intres=n+sumB(n-1);returnres;}A.sumA体现了迭代的思想。B.SumB采⽤的是递归⽅式。C.SumB函数⽐SumA的时间效率更⾼。D.两个函数的实现的功能相同。4.有如下函数fun,则fun(20,12)的返回值为()。intfun(inta,intb){if(a%b==0)returnb;elsereturnfun(b,a%b);}A.20B.12C.4D.25.下述代码实现素数表的埃拉托斯特尼筛法,筛选出所有小于等于n的素数,则横线上应填的最佳代码是()。voidsieve_Eratosthenes(intn){vector<bool>is_prime(n+1,true);vector<int>primes;for(inti=2;i*i<=n;i++){if(is_prime[i]){primes.push_back(i);________________________________{//在此处填入代码。is_prime[j]=false;}}}for(inti=sqrt(n)+1;i<=n;i++){if(is_prime[i]){primes.push_back(i);}}returnprimes;}6.下述代码实现素数表的线性筛法,筛选出所有小于等于n的素数,则横线上应填的代码是()。vector<int>sieve_linear(intn){vector<bool>is_prime(n+1,true);vector<int>primes;for(inti=2;i<=n/2;i++){if(is_prime[i])primes.push_back(i);________________________________{//在此处填入代码。is_prime[i*primes[j]]=0;if(i%primes[j]==0)break;}}for(inti=n/2+1;i<=n;i++){if(is_prime[i])primes.push_back(i);}returnprimes;}7.下面函数可以将n的所有质因数找出来,其时间复杂度是()。#include<iostream>#include<vector>vector<int>get_prime_factors(intn){vector<int>factors;while(n%2==0){factors.push_back(2);n/=2;}for(inti=3;i*i<=n;i+=2){while(n%i==0){factors.push_back(i);n/=i;}}if(n>2){factors.push_back(n);}returnfactors;}A.B.C.D.8.现在用如下代码来计算xn(n个x相乘),其时间复杂度为()。doublequick_power(doublex,unsignedn){if(n==0)return1;if(n==1)returnx;returnquick_power(x,n/2)*quick_power(x,n/2)*((n&1)?x:1);}A.B.C.D.9.假设快速排序算法的输入是一个长度为n的已排序数组,且该快速排序算法在分治过程总是选择第一个元素作为基准元素。下面选项()描述的是在这种情况下的快速排序行为。A.快速排序对于此类输入的表现最好,因为数组已经排序。B.快速排序对于此类输入的时间复杂度是O(nlogn)。C.快速排序对于此类输入的时间复杂度是O(n2)。D.快速排序无法对此类数组进行排序,因为数组已经排序。10.考虑以下C++代码实现的归并排序算法,对长度为n的数组arr,挑用函数merge_sort(a,0,n-1),在排序过程中merge函数的递归调用次数大约是()。voidmerge(intarr[],intleft,intmid,intright){intn1=mid-left+1;intn2=right-mid;intL[n1],R[n2];for(inti=0;i<n1;i++)L[i]=arr[left+i];for(intj=0;j<n2;j++)R[j]=arr[mid+1+j];inti=0,j=0,k=left;while(i<n1&&j<n2){if(L[i]<=R[j]){arr[k]=L[i];i++;}else{arr[k]=R[j];j++;}k++;}while(i<n1){arr[k]=L[i];i++;k++;}while(j<n2){arr[k]=R[j];j++;k++;}}voidmerge_sort(intarr[],intleft,intright){if(left<right){intmid=left+(right-left)/2;merge_sort(arr,left,mid);merge_sort(arr,mid+1,right);merge(arr,left,mid,right);}}A.O(1)B.O(n)C.O(logn)D.O(nlogn)11.现在有n个人要过河,每只船最多载2人,船的承重为100kg。下列代码中,数组weight中保存有n个人的体重(单位为kg),已经按从小到大排好序,代码输出过河所需要的船的数目,采用的思想为()。inti,j;intcount=0;for(i=0,j=n-1;i<j;j--){if(weight[i]+weight[j]<=100){i++;}count++;}printf("过河的船数:%d\n",count);A.枚举算法B.贪心算法C.迭代算法D.递归算法12.关于分治算法,以下哪个说法正确()。A.分治算法将问题分成子问题,然后分别解决子问题,最后合并结果。B.归并排序不是分治算法的应用。C.分治算法通常用于解决小规模问题。D.分治算法的时间复杂度总是优于O(nlogn)。13.根据下述二分查找法,在排好序的数组1,3,6,9,17,31,39,52,61,79中查找数值31,循环while(left<=right)执行的次数为()。intbinary_search(vector<int>&nums,inttarget){intleft=0;intright=nums.size()-1;while(left<=right){intmid=left+(right-left)/2;if(nums[mid]==target){returnmid;}elseif(nums[mid]<target){left=mid+1;}else{right=mid-1;}}return-1;//如果找不到目标元素,返回-1。}14.以下关于高精度运算的说法错误的是()。A.高精度计算主要是用来处理大整数或需要保留多位小数的运算。B.大整数除以小整数的处理的步骤可以是,将被除数和除数对齐,从左到右逐位尝试将除数乘以某个数,通过减法得到新的被除数,并累加商。C.高精度乘法的运算时间只与参与运算的两个整数中长度较长者的位数有关。D.高精度加法运算的关键在于逐位相加并处理进位。15.当n=7时,下面函数的返回值为()。intfun(intn){if(n==1)return1;elseif(n>=5)returnn*fun(n-2);elsereturnn*fun(n-1);}二、判断题(每题2分,共20分)。16.在操作系统中,需要对一组进程进行循环。每个进程被赋予一个时间片,当时间片用完时,CPU将切换到下一个进程。这种循环操作可以通过环形链表来实现()。A.正确B.错误17.找出自然数n以内的所有质数,常用算法有埃拉托斯特尼(埃氏)筛法和线性筛法,其中线性筛法效率更高()。A.正确B.错误18.唯一分解定理表明任何一个大于1的整数都可以唯一地分解为素数之和()。A.正确B.错误19.贪心算法通过每一步选择局部最优解,从而一定能获得最优解()。A.正确B.错误20.快速排序和归并排序的平均时间复杂度均为,且都是稳定排序()。A.正确B.错误21.插入排序的时间复杂度总是比快速排序低()。A.正确B.错误22.引入分治策略往往可以提升算法效率。一方面,分治策略减少了操作数量;另一方面,分治后有利于系统的并行优化()。A.正确B.错误23.二分查找要求被搜索的序列是有序的,否则无法保证正确性()。A.正确B.错误24.在C++语言中,递归的实现方式通常会占用更多的栈空间,可能导致栈溢出()。A.正确B.错误25.对于已经定义好的标准数学函数sin(x),应用程序中的语句y=sin(sin(x));是一种递归调用()。A.正确B.错误三、编程题(每题25分,共50分)。26.小杨的武器。题面描述:小杨有n种不同的武器,他对第i种武器的初始熟练度为ci。小杨会依次参加m场战斗,每场战斗小杨只能且必须选择一种武器使用,假设小杨使用了第i种武器参加了第j场战斗,战斗前该武器的熟练度为ci,则战斗后小杨对该武器的熟练度会变为c1i+aj。需要注意的是,aj可能是正数,0或负数,这意味着小杨参加战斗后对武器的熟练度可能会提高,也可能会不变,还有可能降低。小杨想请你编写程序帮他计算出如何选择武器才能使得m场战斗后,自己对n种武器的熟练度的最大值尽可能大。输入格式:第一行包含两个正整数n,m,含义如题面所示。第二行包含n个正整数c1,c2…cn,代表小杨对武器的初始熟练度。第三行包含m个正整数a1,a2…am,代表每场战斗后武器熟练度的变化值。输出格式:输出一个整数,代表m场战斗后小杨对n种武器的熟练度的最大值最大是多少。样例1。一种最优的选择方案为,第一场战斗小杨选择第一种武器,第二场战斗小杨选择第二种武器。对于全部数据,保证有1≤n,m≤105,-104≤ci,ai≤104。27.挑战怪物。题面描述:小杨正在和一个怪物战斗,怪物的血量为h,只有当怪物的血量恰好为0时小杨才能够成功击败怪物。小杨有两种攻击怪物的方式。物理攻击:假设当前为小杨第i次使用物理攻击,则会对怪物造成2i-1点伤害。魔法攻击:小杨选择任意一个质数x(x不能超过怪物当前血量),对怪物造成x点伤害。由于小杨并不擅长魔法,他只能使用至多一次魔法攻击。小杨想知道自己能否击败怪物,如果能,小杨想知道自己最少需要多少次攻击。输入格式:第一行包含一个正整数t,代表测试用例组数。接下来是t组测试用例。对于每组测试用例,第一行包含一个正整数h,代表怪物血量。输出格式:对于每组测试用例,如果小杨能够击败怪物,输出一个整数,代表小杨需要的最少攻击次数,如果不能击败怪物,输出-1。样例1。对于第一组测试用例,一种可能的最优方案为,小杨先对怪物使用魔法攻击,选择质数5造成5点伤害,之后对怪物使用第1次物理攻击,造成2i-1=1点伤害,怪物血量恰好为0,小杨成功击败怪物。对于全部数据,保证有1≤t≤10,1≤h≤105。答案如下。1.答案:C。解析:存储相同数目的整数的时候,数组用的内存应该是更少的,因为数组不需要记录下一个值的地址。2.答案:D。解析:A选项最后一句,此时p->next已经变成了s,所以错了。B选项最后一句,此时p->next已经变成了s,所以错了。C选项最后一句,应该是s->next->prev=s。3.答案:C。解析:sumA函数是递推,sumB函数是递归,两个函数都是求的1~n的和,两个函数的时间复杂度基本一致,都是O(n)。4.答案:C。解析:函数为辗转相除求两数的最大公约数,结果为4,如果没有看出函数作用,也可以手动模拟递归过程。5.答案:C。解析:第六行判断当前的i是质数,所以i的倍数一定不是质数,这里要枚举i的所有的倍数。6.答案:A。解析:这个地方是要枚举质数表,然后把质数的i倍数都筛掉,所以应该是选A。7.答案:C。解析:for循环是要枚举所有的质因子,时间复杂度为根号,while循环的作用为枚举包含多少个当前的质因子,时间复杂度为logn。8.答案:A。解析:这个代码是一个递归的代码,把xn分解为xn/2*xn/2,然后继续递归,直到n=1或0为止,每一部分都递归实现,所以总的时间复杂度应该是O(n)的。9.答案:C。解析:快速排序的过程是,每次选择一个基准值,比基准值大的放到它的右边,比基准值小的放到它的左边,但是这个序列是一个有序序列,且每次都是选择最小的元素作为基准值,所以每次所有的值都会放到基准值的右边,也就是说,每次都只是把基准值这个位置排序好,所以快速排序时间复杂度会退化为O(n2)。10.答案:B。解析:merge_sort函数的作用是递归进行分治的过程,每次把序列分成两半,然后分别处理,merge函数的作用是把两个有序序列,通过双指针操作,合并为一个有序序列。merge函数的调用次数,先是两个数的合并,执行次数为n/2,然后是4个数合并,执行次数为n/4…大约为O(n)。11.答案:B。解析:重量已经按照从小到大排序了,然后双指针处理,双指针的过程为最轻的人和最重的人尝试能否在同一个船上,如果可以,那么他们在同一个船上,否则,当前最重的人不能和其他人在一个船上,得单独一条船。采用的是贪心的思想。12.答案:A。解析:分治算法的思想就是把问题划分成子问题,然后继续划分,知道子问题可以直接解决,然后合并子问题得到的结果,推到原问题的答案。B选项:归并排序的思想就是分治。D选项:分治算法划分子问题的时间一般为logn,总的时间复杂度常为O(nlogn),如归并排序。13.答案:C。解析:模拟即可。第一次:mid=5,nums[5]=17,此时小于要查找的31,所以left=6。第二次:mid=8,nums[8]=52,此时大于要查找的31,所以right=7。第三次:mid=6,nums[6]=31,找到要查找的值,结束。14.答案:C。解析:C选项,高精度的乘法,运算时间和两个整数的长度之和有关,两个长度分别为len1和len2的整数相乘,结果的长度至少为len1+len2。15.答案:C。解析:模拟即可,fun(7)=7*fun(5)=7*5*fun(3)=7*5*3*fun(2)=7*5*3*2*fun(1)=7*5*3*2*1=210。16.答案:正确。解析:进行是循环的,一个进程的时间片用完之后,进行下一个进程,所以进程可以用循环链表实现。17.答案:正确。解析:常见的质数筛有埃氏筛和欧拉筛(线性筛法),其中埃氏筛的时间复杂度为O(nlogn),经过一定的优化,可以到O(nloglogn),欧拉筛的时间复杂度为O(n),大部分情况下,欧拉筛的效率更高。18.答案:错误。解析:任何一个大于等于2的整数,都可以唯一的分解为若干个质数的幂次方的乘积的形式。19.答案:错误。解析:贪心算法的使用条件是——局部最优能够得到全局最优,不是所有的问题都可以通过贪心实现,因为局部最优不一定能得到全局最优。20.答案:错误。解析:快速排序的均摊时间复杂度为O(nlogn),归并排序的时间复杂度是稳定的O(nlogn),所以对于时间复杂度的描述是正确的,但是快速排序不是稳定排序。21.答案:错误。解析:插入排序的时间复杂度为O(n2),快速排序的均摊时间复杂度为O(nlogn),但是快速排序的最坏情况下,时间复杂度也是O(n2)。22.答案:正确。解析:分治算法的思想就是把问题划分成子问题,然后继续划分,知道子问题可以直接解决,然后合并子问题得到的结果,推得原问题的答案,分治提高了算法的效率,减少了操作数量。23.答案:正确。解析:二分查找的前提条件是,序列有序。24.答案:正确。解析:递归用占用栈空间,而栈空间往往不是很大,递归层数过多的时候,可能会导致栈溢出。25.答案:错误。解析:递归是指的函数不断的调用自身,直到当前传参可以得到结果,并返回结果,递归应该是一个从大问题到小问题的分解,然后小问题有了结果并返回,解决大问题,而这个写法只能算是函数嵌套使用。26.参考程序。#include<bits/stdc++.h>usingnamespacestd;constintN=100010;inta[N],c[N];intmain(){intn,m;cin>>n>>m;intmx=-10000;for(inti=1;i<=n;++i){cin>>c[i];mx=max(mx,c[i]);}for(inti=1;i<=m;++i){cin>>a[i];}for(inti=1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论