2026年03月GESPC++五级真题解析(含视频)

发布时间:2026/9/3 16:39:18
2026年03月GESPC++五级真题解析(含视频) 视频讲解GESP2026年3月五级C真题讲解一、单选题第1题解析答案DA需要找到前驱结点才能删除 B没有头结点时存在空指针 C循环双链表尾结点的next指向头结点第2题解析答案C只有C选项符合第3题解析答案B要删除x结点就是x前驱结点 指向 x后驱结点即cur-next del-next第4题解析答案A模拟辗转相除法过程 48/182...12 18/121...6 12/62...0 6/0第5题解析答案Cfor循环primes动态数组即从0下标 至 primes的size第6题解析答案Cis_compostie数组情况 下标1 2 3 4 5 6 7 8 9 10 11 12 13 14 15... 数值0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 假设n为15 i为2时 下标1 2 3 4 5 6 7 8 9 10 11 12 13 14 15... 数值0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 i为3时从3*39开始标记6已经被2的倍数标记过了 下标1 2 3 4 5 6 7 8 9 10 11 12 13 14 15... 数值0 0 0 1 0 1 0 1 1 1 0 1 1 1 1第7题解析答案B二分答案在查找数组中至少k个数据每个数据之间之间的最大值 数组1 2 4 8 9 1 4 93k差距最大为3第8题解析答案A当x时保留当前数据试着往更小去找所以mid需要保留即rmid第9题解析答案D栈溢出程序就无法正常运行了第10题解析答案Acheck(mid)符合条件时往更大去尝试即lmid1 check(mid)不符合条件时往更小去尝试即rmid-1第11题解析答案B循环n次递归logn次即nlogn第12题解析答案B从小到大排序小的先入队A想要入队即A[i]B[j]第13题解析答案C快排最坏的情况是n²第14题解析答案B只有选择排序、快速排序、希尔排序、堆排序是稳定的第15题解析答案Brem代表余数即rem%b二、判断题第1题解析答案√数组访问为O(1)插入元素为O(n) 单链表访问为O(n)插入结点为O(1)第2题解析答案√if( a[mid] x ) r mid; 当 x保留当前答案往更小去二分查找第3题解析答案×8(a) 3 8(b) 4 9 2 1 中间值为4时 2 3 1 4 9 8(a) 6 8(b) 只看4的右边9 8(a) 8(b) 中间值为8(a)时 8(b) 8(a) 9 8(a) 3 8(b)的相对位置发送改变了第4题解析答案√递归函数T(n/2)即复杂度为logn每次递归O(n)即 n logn第5题解析答案×只计算了一次的归并排序逆序对没有用归并排序计算全部的第6题解析答案√例如122*2*3分解质因数只有唯一的情况 罗列36的因数 1 2 3 4 6 9 12 18 36 发现因数成对出现(1,36) (2,18) (3,12) (4,9)只有平方根6特殊 小因数为1 2 3 4大因数9 12 18 36 只需要找小因数没必要找大因数即小因数的范围1x xsqrt(36)第7题解析答案√第8题解析答案×以下硬币选取案例贪心有最优子结构但是没有重叠子结构计算出最优解第9题解析答案×是被最小的质因子筛去假设所有都是质数除了1 数字1 2 3 4 5 6 7 8 9 10 11 12 13 14 15... 标记1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 i从2开始循环 i为2时出现质数2。2*24标记不是质数 数字1 2 3 4 5 6 7 8 9 10 11 12 13 14 15... 标记1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 i为3时出现质数2 3。3*26、3*39标记不是质数 数字1 2 3 4 5 6 7 8 9 10 11 12 13 14 15... 标记1 0 0 1 0 1 0 0 1 0 0 0 0 0 0 i为4时出现质数2 3。2*48标记不是质数 4*3没必要标记等等6*2会标记 所以【以最小质因子筛选】 数字1 2 3 4 5 6 7 8 9 10 11 12 13 14 15... 标记1 0 0 1 0 1 0 0 1 0 0 0 0 0 0第10题解析答案×任何递归都可以改写非递归但是改写后不再需要栈//递归 int fib(int n) { if (n 1) return n; return fib(n-1) fib(n-2); } //改写while int fib(int n) { if (n 1) return n; int a 0, b 1, i 2; while (i n) { int c a b; a b; b c; i; } return b; } //改写for int fib(int n) { if (n 1) return n; int a 0, b 1; for (int i 2; i n; i) { int c a b; a b; b c; } return b; }三、编程题第1题 [GESP202603 五级] 有限不循环小数题目描述若 a1​ 可化为一个有限的不循环的小数则称 a 为终止数。请你求出在 L 到 R 中终止数的数量。输入格式输入一行包含两个整数 L,R。输出格式输出一行包含一个整数表示 L 到 R 中终止数的数量。输入输出样例输入 #12 11输出 #15说明/提示样例解释在 [2,11] 终止数有 2、4、5、8、10。数据范围保证 1≤L≤R≤10^6。答案#includebits/stdc.h using namespace std; int main(){ //1)确定范围 int L,R;cinLR; //2)循环L至R int ans0; for(int iL;iR;i){ //3)判断是否为终止数 //只能是2或5的倍数 int copyi; while(copy%20) copy/2; while(copy%50) copy/5; if(copy1) ans; } coutans; return 0; }第2题 [GESP202603 五级] 找数题目描述给定一个包含 n 个互不相同的正整数的数组 A 与一个包含 m 个互不相同的正整数的数组 B请你帮忙计算有多少个数在数组 A 与数组 B 中均出现。输入格式第一行包含两个整数 n,m。第二行包含 n 个正整数 a1​,a2​,⋯,an​ 表示数组 A。第三行包含 m 个正整数 b1​,b2​,⋯,bm​ 表示数组 B。输出格式输出一个整数表示在数组 A 与数组 B 中均出现的数的个数。输入输出样例输入 #13 5 4 2 3 3 1 5 4 6输出 #12说明/提示样例解释样例 1 中4、3 在数组 A 与 B 中均出现。数据范围对于 40% 的数据保证 1≤n,m≤1000。对于 100% 的数据保证 1≤n,m≤10^51≤ai​,bi​≤10^9。答案#includebits/stdc.h using namespace std; mapint,bool vis; int main(){ //1)填充数据 int n,m; cinnm; for(int i1;in;i){ int a;cina; //2)标记出现 vis[a]1; } //3)根据vis标记 判断是否重复出现 int ans0; for(int i1;im;i){ int b;cinb; if(vis[b]1) ans; } coutans; return 0; }