GESP C++ 利用AI工具自练自学真题(选择和判断)
GESP C++ 利用AI工具自练自学真题(选择和判断)
目前,我已经按照GESP大纲的要求,学习了相关的知识点。下一步,将通过做题检验学习的成果,以及知识点的查漏补缺。做法是通过 AI 工具,从官方的真题开始进行练习。具体方法是:
-
1. 通过GESP的官网下载真题; -
2. 自己做一遍,记录答案; -
3. 把真题上传到AI工具; -
4. 输入提示词,让AI工具帮助分析; -
5. 通过不断地提问和反向出题,巩固和加强所有的知识点;
一、提示词(选择和判断题,供参考)
你是GESP, NOI, IOI的考试和竞赛的培训老师,正在总结附件中GESP五级C++考试真题的考点和相关的知识点。仅仅分析选择题,逐题详细的分析以下内容:
-
1. 考察的知识点 -
2. 知识点详解 -
3. 选项对错分析 -
4. 答案 -
5. 易错点分析 -
6. 相关的知识点
其中知识点按照以下的官方大纲分类:
-
1. 初等数论 -
• 素数与合数、最大公约数与最小公倍数、同余与模运算、约数与倍数、质因数分解、奇偶性 -
• 欧几里得算法 -
• 唯一分解定理 -
• 素数表的埃氏筛法和线性筛法 -
2. 算法复杂度估算方法 -
• 含多项式的算法复杂度 -
• 含对数的算法复杂度 -
3. C++高精度运算 -
• C++数组模拟高精度加法、减法、乘法、除法 -
4. 链表 -
• 单链表、双链表、循环链表的创建、插入、删除、遍历、查找的基本操作 -
5. 二分算法 -
• 二分查找算法 -
• 二分答案算法(也称二分枚举法) -
6. 递归算法 -
• 递归算法的相关概念 -
• 递归算法的时间复杂度和空间复杂度 -
• 递归的优化策略 -
7. 分治算法 -
• 归并排序算法 -
• 快速排序算法 -
8. 贪心算法 -
• 贪心算法的相关概念 -
• 最优子结构
把上面提示词中的 选择题 改成 判断题,再分析一遍判断题,避免一次性输入内容太多,AI工具会简化回答。
二、AI工具的结果样例(2026年4月15日)
注意:不同AI工具的效果不一样,可以根据自己的习惯,选择不同的工具,针对不确定的知识点,可以利用不同的AI工具进行交叉验证。
GESP五级C++2026年03月选择题逐题考点分析
以下按照官方大纲分类,对15道选择题逐题进行知识点、详解、选项分析、答案、易错点、相关知识点的全方位解析,严格匹配考试大纲要求。
第1题
1. 考察的知识点
链表 – 单链表、双链表、循环链表的基本特性与空表判定
2. 知识点详解
-
• 单链表:每个结点仅存后继指针,已知任意结点指针无法直接删除(需前驱结点),时间复杂度非; -
• 循环链表:首尾结点相连,带头结点的循环单链表空表判定为头结点 next指向自身;不带头结点的循环单链表若为空则存在空指针; -
• 循环双链表:尾结点 next指向头结点,头结点prev指向尾结点,无nullptr; -
• 带头结点链表:头结点不存储数据,仅用于统一操作,简化空表、头结点操作逻辑。
3. 选项对错分析
-
• A错误:单链表中仅知当前结点指针,无法获取前驱结点,删除操作需先遍历找前驱,时间复杂度为,非; -
• B错误:循环链表仅带头结点时无空指针,不带头结点的空循环链表存在空指针,“一定不存在”表述绝对; -
• C错误:循环双链表的尾结点 next指针指向头结点,而非nullptr,nullptr是普通双链表尾结点的后继特征; -
• D正确:带头结点的循环单链表,空表时无数据结点,头结点的 next指针只能指向自身。
4. 答案
D
5. 易错点分析
混淆带头结点/不带头结点循环链表的空指针特性,误判循环链表“一定无空指针”;忽略单链表删除操作对前驱结点的依赖。
6. 相关的知识点
链表的头结点作用;单/双/循环链表的插入、删除操作的指针修改逻辑;链表的空表、尾结点判定方法。
第2题
1. 考察的知识点
链表 – 双向循环链表的结点插入操作(指定结点前插入)
2. 知识点详解
双向循环链表中,每个结点有prev(前驱)和next(后继)指针,在结点p前插入新结点s的核心逻辑:
-
1. s的后继指向p( s->next = p); -
2. s的前驱指向p的原前驱( s->prev = p->prev); -
3. p的原前驱的后继指向s( p->prev->next = s); -
4. p的前驱更新为s( p->prev = s);
操作顺序:先绑定s的前后指针,再修改原有结点的指针,避免链表断链。
3. 选项对错分析
-
• A错误:引入未定义的变量 q,题目仅给出p和s,无q,语法与逻辑均错误; -
• B错误:指针操作逻辑为“在p后插入s”,与题目“p前插入”要求不符; -
• C正确:严格遵循双向循环链表前插的4步核心逻辑,无断链、无未定义变量; -
• D错误:将 s->prev赋值为nullptr,破坏了双向循环链表的循环特性(无空指针),且缺少修改p原前驱的后继指针,链表断链。
4. 答案
C
5. 易错点分析
混淆“指定结点前插/后插”的指针操作逻辑;插入时未先绑定新结点指针,直接修改原结点指针导致链表断链;忽略双向循环链表无空指针的特性。
6. 相关的知识点
双向链表的前插/后插操作;循环链表的指针闭环特性;链表插入操作的“先连后断”原则。
第3题
1. 考察的知识点
链表 – 单链表的删除操作(哑结点/头结点统一处理头、中间结点删除)
2. 知识点详解
哑结点(头结点) 的核心作用:统一单链表头结点和中间结点的删除逻辑,避免单独处理头结点删除时的指针变更问题。
单链表删除cur->next结点的步骤:
-
1. 保存待删除结点指针( Node* del = cur->next); -
2. 将 cur的后继指向待删除结点的后继(cur->next = del->next),完成链表续接; -
3. 释放待删除结点内存( delete del)。
3. 选项对错分析
-
• A错误: cur = cur->next会跳过后续结点,导致无法删除连续的目标值结点; -
• B正确:完成链表续接,使 cur的后继指向待删除结点的下一个结点,避免断链; -
• C错误: del->next = cur->next无意义,待删除结点即将被释放,且未修改cur的后继,链表断链; -
• D错误: cur->next = nullptr会直接截断链表,后续结点无法遍历和处理。
4. 答案
B
5. 易错点分析
忘记删除结点前的链表续接操作,直接释放结点导致断链;混淆哑结点的遍历逻辑,误将cur后移而非修改cur->next;忽略连续目标值结点的删除需求。
6. 相关的知识点
单链表的遍历与删除;动态内存的释放(delete);哑结点在链表操作中的简化作用;链表断链的避免方法。
第4题
1. 考察的知识点
初等数论 – 欧几里得算法(辗转相除法)的递归调用过程
2. 知识点详解
欧几里得算法核心公式:,终止条件为,此时返回即为最大公约数。
计算规则:每次将后一个数作为新的第一个数,前一个数对后一个数取余作为新的第二个数,直至余数为0。
3. 选项对错分析
计算的步骤:
-
1. → → ; -
2. → → ; -
3. → → ; -
4. 终止,返回6。
-
• A正确:严格遵循欧几里得算法的递归调用序列; -
• B错误:误将 a-b代替a%b,违背欧几里得算法核心; -
• C错误:交换了取余结果与原数的位置,且调用序列提前终止; -
• D错误:颠倒了每次递归的两个参数顺序,逻辑错误。
4. 答案
A
5. 易错点分析
将欧几里得算法的取余(%) 误记为减法(-);混淆递归调用中两个参数的顺序(应为gcd(b, a%b)而非gcd(a%b, b))。
6. 相关的知识点
欧几里得算法的非递归实现;最大公约数与最小公倍数的关系();递归算法的终止条件设计。
第5题
1. 考察的知识点
初等数论 – 素数表的线性筛法(欧拉筛)的核心实现
2. 知识点详解
线性筛(欧拉筛)的核心原理:每个合数仅被其最小质因子筛去,保证时间复杂度为,其核心循环逻辑:
-
1. 外层循环遍历从2到,未被标记的为质数,加入质数数组 primes; -
2. 内层循环遍历已找到的质数 primes[j],标记为合数; -
3. 若,说明是的最小质因子,立即跳出内层循环,避免重复标记。
内层循环条件:(仅遍历已找到的质数)且(不超出范围)。
3. 选项对错分析
-
• A错误:会导致内层循环遍历范围过大,超出质数数组长度,数组越界; -
• B错误:是判断单个数字是否为质数的逻辑,与线性筛内层循环遍历质数数组的需求无关; -
• C正确:保证仅遍历已找到的质数,符合线性筛的核心逻辑; -
• D错误:无实际意义,质数数组的长度与无直接关联,会导致漏筛或重复筛。
4. 答案
C
5. 易错点分析
混淆线性筛内层循环与“质数判定”的循环条件;忘记线性筛内层循环仅遍历已找到的质数,误设置与或相关的条件;忽略数组越界的风险。
6. 相关的知识点
线性筛与埃氏筛的区别;素数的判定方法(试除法);数组越界的避免;合数的最小质因子特性。
第6题
1. 考察的知识点
初等数论 – 素数表的埃氏筛法的优化原理(内层循环从开始)
2. 知识点详解
埃氏筛法的核心:标记质数的所有倍数为合数,原始版本内层循环从开始,优化后从开始,原因:
对于质数,其小于的倍数(),必然存在小于的质因子,该倍数已被该质因子筛去,无需重复标记。
注意:该优化仅减少重复操作,埃氏筛的时间复杂度仍为,无法达到。
3. 选项对错分析
-
• A错误:是的倍数,一定是合数(); -
• B错误:是的平方,一定是合数,而非质数; -
• C正确:小于的的倍数已被更小的质因子筛过,避免重复标记; -
• D错误:埃氏筛无论如何优化,时间复杂度仍为,是线性筛的时间复杂度。
4. 答案
C
5. 易错点分析
误认埃氏筛该优化能将时间复杂度降为;忘记的倍数的前置倍数已被更小质因子筛过;混淆“质数的倍数一定是合数”的基本特性。
6. 相关的知识点
埃氏筛的原始实现与优化;线性筛的无重复标记原理;算法复杂度的区分(埃氏筛vs线性筛);合数的质因子分解特性。
第7题
1. 考察的知识点
二分算法 – 二分答案算法(二分枚举法),结合贪心判定
2. 知识点详解
本题为最大间距问题,是二分答案的经典应用,核心逻辑:
-
1. 二分答案:枚举可能的间距 dist,范围为; -
2. 贪心判定: check函数判断是否能选出至少个点,使得相邻点间距(贪心策略:选第一个点,后续每次选满足间距的最小点); -
3. 二分更新:若 check为真,说明当前dist可行,尝试更大的间距();若为假,尝试更小的间距(),最终即为最大可行间距。
计算步骤:数组排序后为,,最终求得最大间距为3。
3. 选项对错分析
-
• A错误:2不是最大可行间距,存在更大的可行间距3; -
• B正确:贪心判定后,最大可行间距为3; -
• C错误:4不可行,无法选出3个点使相邻间距; -
• D错误:5不可行,间距过大,满足条件的点数量不足。
4. 答案
B
5. 易错点分析
二分答案时的中点计算错误(本题为向上取整mid=(l+r+1)/2,避免死循环);check函数的贪心策略设计错误,误判可行间距;忘记先对数组进行排序。
6. 相关的知识点
二分答案的适用条件(答案具有单调性);贪心算法的判定函数设计;二分查找的边界处理(向上/向下取整);数组排序的必要性。
第8题
1. 考察的知识点
二分算法 – 二分查找算法(lower_bound:找第一个大于等于x的位置)
2. 知识点详解
lower_bound是二分查找的经典应用,左闭右开区间 实现逻辑:
-
1. 初始化,(右边界为数组长度,保证覆盖所有位置); -
2. 循环条件,中点(避免溢出); -
3. 若:说明第一个满足条件的位置在,更新; -
4. 若:说明满足条件的位置在,更新; -
5. 最终即为第一个大于等于x的位置。
3. 选项对错分析
-
• A正确:时,更新,符合左闭右开区间的lower_bound逻辑; -
• B错误:会跳过可能的第一个满足条件的位置,适用于找最后一个小于x的位置; -
• C错误:会导致死循环,左闭右开区间中仅当条件不满足时才右移左边界; -
• D错误:与条件矛盾,会跳过满足条件的位置。
4. 答案
A
5. 易错点分析
混淆左闭右开 和闭区间 的二分边界处理;lower_bound与upper_bound(找第一个大于x的位置)的逻辑混淆;中点计算时的整数溢出(未用代替)。
6. 相关的知识点
upper_bound的二分实现;二分查找的区间选择(左闭右开/闭区间);整数溢出的避免方法;STL中lower_bound/upper_bound的使用。
第9题
1. 考察的知识点
递归算法 – 递归的相关概念、栈溢出、递归与循环的转换
2. 知识点详解
递归算法的核心是函数调用自身,依赖程序栈存储调用帧,关键特性:
-
1. 栈溢出:递归调用层次过深时,程序栈空间被耗尽,导致程序崩溃,栈溢出后程序无法继续执行; -
2. 尾递归:递归调用是函数最后一个操作,编译器可优化为循环,避免栈溢出(无额外调用帧); -
3. 递归转循环:所有递归函数均可通过循环改写,可借助显式栈模拟递归,也可直接通过迭代实现。
3. 选项对错分析
-
• A正确:递归调用的调用帧存储在程序栈中,层次过深会耗尽栈空间,导致栈溢出; -
• B正确:尾递归无后续操作,编译器可消除递归,直接复用当前调用帧,避免栈溢出; -
• C正确:递归的本质是“递推+回溯”,均可通过循环结合显式栈/迭代逻辑改写,避免栈溢出; -
• D错误:栈溢出是严重的运行时错误,会导致程序崩溃,无法抛出异常也无法继续执行后续代码。
4. 答案
D
5. 易错点分析
误认为栈溢出是普通异常,程序可捕获并继续执行;忽略尾递归的编译器优化条件;认为部分递归函数无法转换为循环。
6. 相关的知识点
程序栈的工作原理;尾递归的定义与优化;递归的时间/空间复杂度分析;显式栈模拟递归的方法。
第10题
1. 考察的知识点
二分算法 – 二分答案算法(经典的“木头切割”问题)
2. 知识点详解
本题为二分答案的经典应用,求最大等长切割长度,核心逻辑:
-
1. 二分答案:枚举切割长度,范围为; -
2. 贪心判定: check函数计算所有木头按切割的总段数,若总段数,说明可行; -
3. 二分更新:若为真,说明可行,尝试更大的长度(),并记录当前可行解 ans=mid;若为假,尝试更小的长度()。
3. 选项对错分析
-
• A正确:可行时(尝试更大长度),不可行时(尝试更小长度),符合二分答案的最大化求解逻辑; -
• B错误:参数更新方向颠倒,可行时缩小右边界,不可行时扩大左边界,无法找到最优解; -
• C错误:不可行时会导致死循环,闭区间中需用; -
• D错误:参数更新逻辑完全错误,既无法缩小范围,也会导致死循环。
4. 答案
A
5. 易错点分析
二分答案的边界更新错误,混淆“最大化/最小化”答案的更新策略;忘记记录可行解ans=mid,导致最终无结果;check函数中未处理的情况(除零错误)。
6. 相关的知识点
二分答案的单调性验证;贪心判定函数的设计;闭区间的二分边界处理;除零错误的避免。
第11题
1. 考察的知识点
分治算法 – 最大连续子段和的分治实现,算法复杂度估算方法
2. 知识点详解
最大连续子段和的分治实现核心逻辑:
-
1. 分:将数组划分为左、右两部分,分别求左、右部分的最大连续子段和; -
2. 治:求跨越中点的最大连续子段和(左半部分从中点向左的最大和+右半部分从中点向右的最大和); -
3. 合:最终结果为左、右、跨越中点的最大和中的最大值。
时间复杂度递推:,根据主定理,解得时间复杂度为。
3. 选项对错分析(结合大纲与题型,标准答案为对应选项)
本题核心考查分治算法的时间复杂度估算,递推式是分治的经典递推式,主定理中,满足,故。
4. 答案
C(原卷答案标注为C)
5. 易错点分析
不会用主定理分析分治的时间复杂度;忽略跨越中点的子段和计算的时间复杂度为;误将分治实现的时间复杂度与暴力法()、动态规划法()混淆。
6. 相关的知识点
主定理的应用;最大连续子段和的动态规划实现;分治算法的分、治、合三步法;算法复杂度估算的递推法。
第12题
1. 考察的知识点
分治算法 – 归并排序的合并过程(两个有序数组合并为一个有序数组)
2. 知识点详解
归并排序的合并阶段核心逻辑:两个升序数组、,通过双指针遍历,每次选取较小的元素加入结果数组,直至其中一个数组遍历完毕,再将剩余元素直接追加到结果数组后。
双指针规则:初始化(遍历)、(遍历),若,选取并;否则选取并,保证结果数组升序。
3. 选项对错分析
-
• A错误:会选取较大的元素,结果数组降序,与题目“升序合并”要求不符; -
• B正确:选取较小的元素,符合归并合并的升序逻辑; -
• C错误:是指针索引比较,与数组元素大小无关,无法实现有序合并; -
• D错误:是指针索引比较,与元素大小无关,合并结果无序。
4. 答案
A(原卷答案标注为A,注:原卷可能存在排版/答案标注小误差,核心逻辑为选较小元素)
5. 易错点分析
混淆归并合并的升序/降序选择条件;将指针索引比较与数组元素大小比较混淆;忘记合并的最后一步追加剩余元素。
6. 相关的知识点
归并排序的完整实现(分治+合并);归并排序的稳定性;多个有序数组合并的方法;双指针算法的应用。
第13题
1. 考察的知识点
分治算法 – 快速排序的时间复杂度,算法复杂度估算方法
2. 知识点详解
快速排序的时间复杂度与枢轴(pivot)的选择强相关:
-
1. 最优情况:枢轴将数组划分为两个等长的子数组,时间复杂度,递推式; -
2. 最坏情况:数组已有序,且选取第一个/最后一个元素为枢轴,枢轴将数组划分为的子数组,时间复杂度,递推式; -
3. 平均情况:时间复杂度为。
本题中数组已从小到大排序,且选取第一个元素为枢轴,属于最坏情况。
3. 选项对错分析
本题核心考查快速排序的最坏时间复杂度,数组有序+首元素为枢轴,导致每次划分仅减少一个元素,时间复杂度为(对应原卷答案B)。
4. 答案
B(原卷答案标注为B)
5. 易错点分析
误认为快速排序的时间复杂度始终为;忽略枢轴选择对快速排序时间复杂度的影响;混淆快速排序的最优/最坏/平均情况。
6. 相关的知识点
快速排序的枢轴优化方法(随机枢轴、三数取中);快速排序的稳定性;分治算法的时间复杂度分析;算法复杂度的最优/最坏/平均情况。
第14题
1. 考察的知识点
分治算法 – 排序算法的稳定性、时间复杂度(冒泡、插入、快速、归并)
2. 知识点详解
排序算法的核心属性:
-
1. 稳定性:若排序后相等元素的相对位置不变,则为稳定排序;否则为不稳定排序; -
2. 时间复杂度:包括最好、最坏、平均情况,需区分不同排序的复杂度特征。
核心结论:
-
• 冒泡排序、插入排序:稳定,最好时间复杂度(数组已有序),最坏; -
• 快速排序:不稳定,平均,最坏; -
• 归并排序:稳定,最好、最坏、平均均为。
3. 选项对错分析
-
• A正确:冒泡排序和插入排序均为稳定排序,符合定义; -
• B错误:归并排序是稳定排序,该选项称“快速和归并均不稳定”,表述错误; -
• C正确:冒泡和插入排序在数组已有序时,仅需一次遍历,最好时间复杂度; -
• D正确:归并排序的分治逻辑决定了其所有情况的时间复杂度均为。
4. 答案
B(原卷答案标注为B)
5. 易错点分析
混淆归并排序的稳定性(误认为不稳定);忘记冒泡/插入排序的最好时间复杂度为;将快速排序的平均时间复杂度当作最坏时间复杂度。
6. 相关的知识点
常见排序算法的稳定性、时间复杂度总结;稳定排序的应用场景;排序算法的选择依据(数据规模、有序性、稳定性);堆排序的复杂度与稳定性。
第15题
1. 考察的知识点
C++高精度运算 – 数组模拟高精度除法(大整数字符串÷小整数int)
2. 知识点详解
大整数除法(字符串→数组,除以小整数) 的核心逻辑:
-
1. 将大整数的字符串转换为数字数组(高位在前); -
2. 初始化余数 rem=0,遍历数组的每一位数字; -
3. 每一步计算: rem = rem * 10 + 数组当前位(将前一位的余数与当前位组合); -
4. 计算当前位的商: q = rem / b,加入商数组; -
5. 更新余数: rem = rem % b(保留当前余数,用于下一位计算); -
6. 最后去除商数组的前导零,输出商和最终余数。
3. 选项对错分析
-
• A错误: rem /= b等价于rem = rem / b,会丢失余数的关键部分,无法进行下一位计算; -
• B正确: rem %= b保留当前位计算后的余数,用于与下一位数字组合,是高精度除法的核心步骤; -
• C错误: rem = b会直接覆盖余数,导致后续计算完全错误; -
• D错误: rem = q将商赋值给余数,违背除法的余数计算逻辑,后续计算错误。
4. 答案
B(原卷答案标注为B)
5. 易错点分析
混淆高精度除法中商和余数的计算逻辑;忘记更新余数时需用取余(%) 而非除法(/);忽略前导零的去除步骤;大整数数组的高位在前/低位在前存储方式混淆。
6. 相关的知识点
C++高精度加法、减法、乘法的数组模拟;大整数的存储方式(高位在前/低位在前);取余运算的性质;前导零的处理方法。
夜雨聆风