乐于分享
好东西不私藏

GESP C++ 利用AI工具自练自学真题(选择和判断)

GESP C++ 利用AI工具自练自学真题(选择和判断)

GESP C++ 利用AI工具自练自学真题(选择和判断)

目前,我已经按照GESP大纲的要求,学习了相关的知识点。下一步,将通过做题检验学习的成果,以及知识点的查漏补缺。做法是通过 AI 工具,从官方的真题开始进行练习。具体方法是:

  1. 1. 通过GESP的官网下载真题;
  2. 2. 自己做一遍,记录答案;
  3. 3. 把真题上传到AI工具;
  4. 4. 输入提示词,让AI工具帮助分析;
  5. 5. 通过不断地提问和反向出题,巩固和加强所有的知识点;

一、提示词(选择和判断题,供参考)

你是GESP, NOI, IOI的考试和竞赛的培训老师,正在总结附件中GESP五级C++考试真题的考点和相关的知识点。仅仅分析选择题,逐题详细的分析以下内容:

  1. 1. 考察的知识点
  2. 2. 知识点详解
  3. 3. 选项对错分析
  4. 4. 答案
  5. 5. 易错点分析
  6. 6. 相关的知识点

其中知识点按照以下的官方大纲分类:

  1. 1. 初等数论
    • • 素数与合数、最大公约数与最小公倍数、同余与模运算、约数与倍数、质因数分解、奇偶性
    • • 欧几里得算法
    • • 唯一分解定理
    • • 素数表的埃氏筛法和线性筛法
  2. 2. 算法复杂度估算方法
    • • 含多项式的算法复杂度
    • • 含对数的算法复杂度
  3. 3. C++高精度运算
    • • C++数组模拟高精度加法、减法、乘法、除法
  4. 4. 链表
    • • 单链表、双链表、循环链表的创建、插入、删除、遍历、查找的基本操作
  5. 5. 二分算法
    • • 二分查找算法
    • • 二分答案算法(也称二分枚举法)
  6. 6. 递归算法
    • • 递归算法的相关概念
    • • 递归算法的时间复杂度和空间复杂度
    • • 递归的优化策略
  7. 7. 分治算法
    • • 归并排序算法
    • • 快速排序算法
  8. 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指针指向头结点,而非nullptrnullptr是普通双链表尾结点的后继特征;
  • • D正确:带头结点的循环单链表,空表时无数据结点,头结点的next指针只能指向自身。

4. 答案

D

5. 易错点分析

混淆带头结点/不带头结点循环链表的空指针特性,误判循环链表“一定无空指针”;忽略单链表删除操作对前驱结点的依赖。

6. 相关的知识点

链表的头结点作用;单/双/循环链表的插入、删除操作的指针修改逻辑;链表的空表、尾结点判定方法。

第2题

1. 考察的知识点

链表 – 双向循环链表的结点插入操作(指定结点前插入)

2. 知识点详解

双向循环链表中,每个结点有prev(前驱)和next(后继)指针,在结点p前插入新结点s的核心逻辑:

  1. 1. s的后继指向p(s->next = p);
  2. 2. s的前驱指向p的原前驱(s->prev = p->prev);
  3. 3. p的原前驱的后继指向s(p->prev->next = s);
  4. 4. p的前驱更新为s(p->prev = s);
    操作顺序:先绑定s的前后指针,再修改原有结点的指针,避免链表断链。

3. 选项对错分析

  • • A错误:引入未定义的变量q,题目仅给出ps,无q,语法与逻辑均错误;
  • • B错误:指针操作逻辑为“在p后插入s”,与题目“p前插入”要求不符;
  • • C正确:严格遵循双向循环链表前插的4步核心逻辑,无断链、无未定义变量;
  • • D错误:将s->prev赋值为nullptr,破坏了双向循环链表的循环特性(无空指针),且缺少修改p原前驱的后继指针,链表断链。

4. 答案

C

5. 易错点分析

混淆“指定结点前插/后插”的指针操作逻辑;插入时未先绑定新结点指针,直接修改原结点指针导致链表断链;忽略双向循环链表无空指针的特性。

6. 相关的知识点

双向链表的前插/后插操作;循环链表的指针闭环特性;链表插入操作的“先连后断”原则。

第3题

1. 考察的知识点

链表 – 单链表的删除操作(哑结点/头结点统一处理头、中间结点删除)

2. 知识点详解

哑结点(头结点) 的核心作用:统一单链表头结点中间结点的删除逻辑,避免单独处理头结点删除时的指针变更问题。
单链表删除cur->next结点的步骤:

  1. 1. 保存待删除结点指针(Node* del = cur->next);
  2. 2. 将cur的后继指向待删除结点的后继(cur->next = del->next),完成链表续接;
  3. 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. 1.  →  → 
  2. 2.  →  → 
  3. 3.  →  → 
  4. 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. 1. 外层循环遍历从2到,未被标记的为质数,加入质数数组primes
  2. 2. 内层循环遍历已找到的质数primes[j],标记为合数;
  3. 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. 1. 二分答案:枚举可能的间距dist,范围为
  2. 2. 贪心判定check函数判断是否能选出至少个点,使得相邻点间距(贪心策略:选第一个点,后续每次选满足间距的最小点);
  3. 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. 1. 初始化(右边界为数组长度,保证覆盖所有位置);
  2. 2. 循环条件,中点(避免溢出);
  3. 3. 若:说明第一个满足条件的位置在,更新
  4. 4. 若:说明满足条件的位置在,更新
  5. 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. 1. 栈溢出:递归调用层次过深时,程序栈空间被耗尽,导致程序崩溃,栈溢出后程序无法继续执行
  2. 2. 尾递归:递归调用是函数最后一个操作,编译器可优化为循环,避免栈溢出(无额外调用帧);
  3. 3. 递归转循环:所有递归函数均可通过循环改写,可借助显式栈模拟递归,也可直接通过迭代实现。

3. 选项对错分析

  • • A正确:递归调用的调用帧存储在程序栈中,层次过深会耗尽栈空间,导致栈溢出;
  • • B正确:尾递归无后续操作,编译器可消除递归,直接复用当前调用帧,避免栈溢出;
  • • C正确:递归的本质是“递推+回溯”,均可通过循环结合显式栈/迭代逻辑改写,避免栈溢出;
  • • D错误:栈溢出是严重的运行时错误,会导致程序崩溃,无法抛出异常也无法继续执行后续代码。

4. 答案

D

5. 易错点分析

误认为栈溢出是普通异常,程序可捕获并继续执行;忽略尾递归的编译器优化条件;认为部分递归函数无法转换为循环。

6. 相关的知识点

程序栈的工作原理;尾递归的定义与优化;递归的时间/空间复杂度分析;显式栈模拟递归的方法。

第10题

1. 考察的知识点

二分算法 – 二分答案算法(经典的“木头切割”问题)

2. 知识点详解

本题为二分答案的经典应用,求最大等长切割长度,核心逻辑:

  1. 1. 二分答案:枚举切割长度,范围为
  2. 2. 贪心判定check函数计算所有木头按切割的总段数,若总段数,说明可行;
  3. 3. 二分更新:若为真,说明可行,尝试更大的长度(),并记录当前可行解ans=mid;若为假,尝试更小的长度()。

3. 选项对错分析

  • • A正确:可行时(尝试更大长度),不可行时(尝试更小长度),符合二分答案的最大化求解逻辑;
  • • B错误:参数更新方向颠倒,可行时缩小右边界,不可行时扩大左边界,无法找到最优解;
  • • C错误:不可行时会导致死循环,闭区间中需用
  • • D错误:参数更新逻辑完全错误,既无法缩小范围,也会导致死循环。

4. 答案

A

5. 易错点分析

二分答案的边界更新错误,混淆“最大化/最小化”答案的更新策略;忘记记录可行解ans=mid,导致最终无结果;check函数中未处理的情况(除零错误)。

6. 相关的知识点

二分答案的单调性验证;贪心判定函数的设计;闭区间的二分边界处理;除零错误的避免。

第11题

1. 考察的知识点

分治算法 – 最大连续子段和的分治实现,算法复杂度估算方法

2. 知识点详解

最大连续子段和的分治实现核心逻辑:

  1. 1. :将数组划分为左、右两部分,分别求左、右部分的最大连续子段和;
  2. 2. :求跨越中点的最大连续子段和(左半部分从中点向左的最大和+右半部分从中点向右的最大和);
  3. 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. 1. 最优情况:枢轴将数组划分为两个等长的子数组,时间复杂度,递推式
  2. 2. 最坏情况:数组已有序,且选取第一个/最后一个元素为枢轴,枢轴将数组划分为的子数组,时间复杂度,递推式
  3. 3. 平均情况:时间复杂度为
    本题中数组已从小到大排序,且选取第一个元素为枢轴,属于最坏情况

3. 选项对错分析

本题核心考查快速排序的最坏时间复杂度,数组有序+首元素为枢轴,导致每次划分仅减少一个元素,时间复杂度为(对应原卷答案B)。

4. 答案

B(原卷答案标注为B)

5. 易错点分析

误认为快速排序的时间复杂度始终为;忽略枢轴选择对快速排序时间复杂度的影响;混淆快速排序的最优/最坏/平均情况。

6. 相关的知识点

快速排序的枢轴优化方法(随机枢轴、三数取中);快速排序的稳定性;分治算法的时间复杂度分析;算法复杂度的最优/最坏/平均情况。

第14题

1. 考察的知识点

分治算法 – 排序算法的稳定性、时间复杂度(冒泡、插入、快速、归并)

2. 知识点详解

排序算法的核心属性

  1. 1. 稳定性:若排序后相等元素的相对位置不变,则为稳定排序;否则为不稳定排序;
  2. 2. 时间复杂度:包括最好、最坏、平均情况,需区分不同排序的复杂度特征。
    核心结论
  • • 冒泡排序、插入排序:稳定,最好时间复杂度(数组已有序),最坏
  • • 快速排序:不稳定,平均,最坏
  • • 归并排序:稳定,最好、最坏、平均均为

3. 选项对错分析

  • • A正确:冒泡排序和插入排序均为稳定排序,符合定义;
  • • B错误:归并排序是稳定排序,该选项称“快速和归并均不稳定”,表述错误;
  • • C正确:冒泡和插入排序在数组已有序时,仅需一次遍历,最好时间复杂度
  • • D正确:归并排序的分治逻辑决定了其所有情况的时间复杂度均为

4. 答案

B(原卷答案标注为B)

5. 易错点分析

混淆归并排序的稳定性(误认为不稳定);忘记冒泡/插入排序的最好时间复杂度为;将快速排序的平均时间复杂度当作最坏时间复杂度。

6. 相关的知识点

常见排序算法的稳定性、时间复杂度总结;稳定排序的应用场景;排序算法的选择依据(数据规模、有序性、稳定性);堆排序的复杂度与稳定性。

第15题

1. 考察的知识点

C++高精度运算 – 数组模拟高精度除法(大整数字符串÷小整数int)

2. 知识点详解

大整数除法(字符串→数组,除以小整数) 的核心逻辑:

  1. 1. 将大整数的字符串转换为数字数组(高位在前);
  2. 2. 初始化余数rem=0,遍历数组的每一位数字;
  3. 3. 每一步计算:rem = rem * 10 + 数组当前位(将前一位的余数与当前位组合);
  4. 4. 计算当前位的商:q = rem / b,加入商数组;
  5. 5. 更新余数rem = rem % b(保留当前余数,用于下一位计算);
  6. 6. 最后去除商数组的前导零,输出商和最终余数。

3. 选项对错分析

  • • A错误rem /= b等价于rem = rem / b,会丢失余数的关键部分,无法进行下一位计算;
  • • B正确rem %= b保留当前位计算后的余数,用于与下一位数字组合,是高精度除法的核心步骤;
  • • C错误rem = b会直接覆盖余数,导致后续计算完全错误;
  • • D错误rem = q将商赋值给余数,违背除法的余数计算逻辑,后续计算错误。

4. 答案

B(原卷答案标注为B)

5. 易错点分析

混淆高精度除法中余数的计算逻辑;忘记更新余数时需用取余(%) 而非除法(/);忽略前导零的去除步骤;大整数数组的高位在前/低位在前存储方式混淆。

6. 相关的知识点

C++高精度加法、减法、乘法的数组模拟;大整数的存储方式(高位在前/低位在前);取余运算的性质;前导零的处理方法。