GESP2026年9月认证C++八级( 第一部分选择题(1~7题)精讲



🏰 第1题:数字城堡------数一数有多少个三位数

题目:

用数字 0、1、2、3 、4 、5组成没有重复数字的三位数,并且这个三位数能被 3 整除,共有多少个?

本题答案是 B、40。

这道题真正考的是:

⭐ "枚举 + 数位限制 + 整除规律"


① 什么叫"三位数"?

比如:

复制代码
123
245
907

都是三位数。

但是:

复制代码
012

不算三位数。

因为它实际上就是:

复制代码
12

所以百位不能是 0。


② "不能重复"是什么意思?

假如数字是:

复制代码
1 2 3 4 5

那么:

复制代码
123

可以。

但是:

复制代码
112

不可以。

因为 1 出现了两次。

所以我们可以把三个位置想象成三个房间:

复制代码
百位     十位     个位
 ↓        ↓        ↓
[  ]     [  ]     [  ]

每个房间放一个数字,而且不能重复。


③ 计算过程:

🌟 第一步:先记住"三位数"的规则

三位数的百位不能是 0。

例如:

  • 123 ✅ 是三位数

  • 305 ✅ 是三位数

  • 012 ❌ 不是三位数

而且题目要求没有重复数字。


🌟 第二步:判断一个数能不能被 3 整除

有一个非常重要的口诀:

一个数能被 3 整除 ⇔ 各个数字的和能被 3 整除。

例如:

123

因为:

1+2+3=6

6 能被 3 整除,所以 123 能被 3 整除。

再比如:

405

4+0+5=9

9 能被 3 整除,所以 405 也能被 3 整除。


🌟 第三步:先挑出3个数字

我们从:

0,1,2,3,4,5

中选择 3个不同的数字。

按照数字对 3 的余数分类:

数字 除以3的余数
0、3 0
1、4 1
2、5 2

三个数字的和要能被3整除,有三种情况:

情况①:0 + 0 + 0

只能选择:

{0,3}

但只有两个数字,不够选3个。

所以 0种。


情况②:0 + 1 + 2

每一类各选一个:

  • 余数0:0、3 → 2种

  • 余数1:1、4 → 2种

  • 余数2:2、5 → 2种

所以:

2 × 2 × 2 = 8

得到 8组数字。


情况③:1 + 1 + 1

从 1、4 中选3个,不可能。

所以 0种。


情况④:2 + 2 + 2

从 2、5 中选3个,也不可能。

所以 0种。


因此,我们真正需要考虑的,就是 8组数字:

{0,1,2} {0,1,5} {0,4,2} {0,4,5} {3,1,2} {3,1,5} {3,4,2} {3,4,5}


🌟 第四步:每组数字能组成几个三位数?

这里是本题最容易"粗心翻车"的地方!

如果没有 0,3个数字可以随便排列:

3!=3×2×1=6

例如 {1,2,5}:

125、152、215、251、512、521

一共6个。


但是!含有0的组不一样!

例如 {0,1,2}。

三个数字一共有:

3! = 6

种排列:

012、021、102、120、201、210

但是:

  • 012 ❌

  • 021 ❌

因为它们不是三位数。

所以只有:

102、120、201、210

一共 4个。


🌟 第五步:8组里面有几组含0?

前面的8组中:

  • 含0的:4组

  • 不含0的:4组

所以总数:

4×4 + 4×6 =16+24 = 40

🎉 答案就是 B:40个!


🧠 本题"解题三连"

遇到这道题,不要一个一个数字瞎试,可以按照下面的方法:

① 先看"能不能被3整除"

看数字之和,不用真的算整个三位数!


② 再看"有没有0"

有0,排列时要扣掉百位为0的情况。


③ 最后排列

  • 没有0: 3个数字 → 3! = 6个

  • 有0: 3个数字 → 6-2=4个


所以本题:

4×4+4×6 = 40


🧠 记忆口诀

三位数先看百位,不能重复看三位,最后分开来检查整除,最后结果合起来。



🎡 第2题:围成一圈坐------圆排列来了!

题目大意:

6个人围成一圈坐,座位没有区分,但区分时针方向,而且甲、乙两人必须相邻。共有多少种不同坐法?

第2题答案是 C、48。

有的同学,这题第一次看容易懵:

"座位没有区分"是什么意思?


1、🎠 普通排队 vs 围成一圈

假设有:

复制代码
A B C D

排成一排:

复制代码
A B C D

和:

复制代码
B C D A

是不同的。

但是围成圆圈以后:

复制代码
  A
D   B
  C

如果整体转一下:

复制代码
  B
A   C
  D

其实大家的相对位置没有改变。

所以:

圆桌排列不能把"整体旋转"当成新的排列。


2、🧩 甲乙必须相邻怎么办?

这是本题最重要的技巧。

假设:

复制代码
甲 乙

必须挨在一起。

我们可以把他们看成一个"超级小队":

复制代码
[甲乙]

于是原来:

复制代码
甲、乙、丙、丁、戊......

就变成:

复制代码
[甲乙]、丙、丁、戊......

问题瞬间简单很多!


3、⚠️ 但是还有一个坑

甲乙可以:

复制代码
甲乙

也可以:

复制代码
乙甲

所以最后还要考虑:

复制代码
2种

🌟 这就是一个非常重要的排列组合技巧

以后看到:

"A、B必须相邻"

马上想到:

捆绑法!

把:

复制代码
A B

捆成:

复制代码
[AB]

然后再排列。


4、⭐ 先安排这5个"对象"

现在有:

  • [甲乙]
  • 丙
  • 丁
  • 戊
  • 己

一共5个对象。

5个不同的人(或对象)围成圆桌:

(5−1)!

所以:

4! = 24

种。


5、⭐ 别忘了甲乙内部还有两种顺序!

甲乙绑在一起,并不意味着:

复制代码
甲乙

只有这一种。

还可以:

复制代码
乙甲

因为题目只说:

甲、乙必须相邻

并没有规定谁坐谁左边。

所以:

2

种。


6、🎯 最终答案

因此:

4! × 2 = 24 × 2 = 48

所以答案:

✅ C、48种


7、🧠 给同学们一个特别好记的口诀

遇到:

"几个人围成一圈 + 某两个人必须相邻"

可以马上想到:

第一步:绑起来

甲+乙 → [甲乙]


第二步:算圆排列

原来6个人,绑成一个后变成5个:

(5−1)!


第三步:考虑内部顺序

甲乙有:

2!

种。

所以:

(6−1−1)! × 2!

也就是:

4!×2!=48


🚨 容易犯的两个错误

❌ 错误1:直接算 6!

这是把圆桌当成排队了。

圆桌整体旋转后应该算同一种,所以不能直接 6!。


❌ 错误2:算 4! 后忘记乘2

有人会想:

"甲乙绑起来,剩下5个,圆排列就是4!=24。"

但是漏掉了:

复制代码
甲乙
乙甲

这两种是不同的。


🌟 最终记忆

圆桌先消旋转,

相邻先把人绑,

绑完再算圆排列,

内部顺序别忘光!

这道题真正考的是,能不能识别出两个核心思想:

① 圆排列:(n-1)!

② 相邻问题:捆绑法。



🪨 第3题:合并石子------不要乱合,要找最优方案!

题目:

有4堆石子,数量分别为1、2 、 3、 4。每次可以合并相邻两堆,合并代价是两堆石子的数量之和。最终把所有石子合成一堆,求最小总代价。

本题答案是:

B、19

这道题非常重要,因为它开始进入:

⭐ 贪心思想


🪨 为什么合并顺序很重要?

比如有:

复制代码
1  2  3  4

如果先合:

复制代码
1 + 2 = 3

花费:

复制代码
3

现在:

复制代码
3 3 4

再合:

复制代码
3 + 3 = 6

花费:

复制代码
6

最后:

复制代码
6 + 4 = 10

花费:

复制代码
10

总花费:

复制代码
3 + 6 + 10 = 19

但是如果换一种合并顺序,结果可能不同。

所以:

不是"能合就合",而是要想办法让总成本最小。


🧠 为什么小的数字应该尽量早合?

这是这类题最重要的直觉。

假设有:

复制代码
1 2 100

如果先把:

复制代码
1 + 2

合起来:

复制代码
3

只花:

复制代码
3

而如果让 100 很早参加合并,它后面可能还会被重复计算。


因为:

复制代码
越早合并的石子
↓
会参与更多次后续合并
↓
所以越应该让"小的东西"早出现

这就是一种非常经典的:

让小成本尽早发生。


🌟 这题还埋了一个重要知识点

题目特别强调:

只能合并相邻两堆。

这意味着它和普通的"随便合并"问题不完全一样。

如果不限制相邻,可以使用:

复制代码
优先队列 priority_queue

每次找最小的两堆。

但这里有:

复制代码
相邻

这个限制。

所以做题的时候一定要仔细看题目的限制条件。


可以使用区间DP来解决这个问题

如果石子数量变多,例如:

4 5 9 2 7 3 8

可以使用区间动态规划。

设:

sumij

表示第 i 堆到第 j 堆石子的总数量。

设:

dpij

表示将第 i 堆到第 j 堆合并成一堆的最小总代价。

状态转移:

这里的 k 表示最后一次合并时,左边和右边的分界位置。

这道题就成为一个区间DP问题。



🌳 第4题:二叉树遍历------根据先序+中序还原树

题目给出:

先序:

复制代码
A B D E C F G

中序:

复制代码
D B E A F C G

问:

后序遍历是什么?

答案是:

A 选项:D E B F G C A。


🌳 第一步:先搞懂三个遍历

先序

顺序:

复制代码
根 → 左 → 右

口诀:

根左右


中序

顺序:

复制代码
左 → 根 → 右

口诀:

左根右


后序

顺序:

复制代码
左 → 右 → 根

口诀:

左右根


🧙 第二步:找到根节点

先序:

复制代码
A B D E C F G
↑
第一个就是根

所以:

复制代码
A

是整棵树的根。


🔍 第三步:在中序中寻找 A

中序:

复制代码
D B E A F C G
      ↑
      A

所以:

复制代码
左边:
D B E

右边:
F C G

于是树的大概形状:

复制代码
        A
       / \
      ?   ?

🌳 第四步:分析左子树

左边有:

复制代码
D B E

先序中 A 后面的部分是:

复制代码
B D E

所以左子树的根是:

复制代码
B

中序:

复制代码
D B E
  ↑
  B

因此:

复制代码
    B
   / \
  D   E

🌳 第五步:分析右子树

右边:

复制代码
F C G

对应先序:

复制代码
C F G

所以右子树根是:

复制代码
C

中序:

复制代码
F C G
  ↑
  C

因此:

复制代码
    C
   / \
  F   G

🎯 整棵树出来了!

复制代码
        A
       / \
      B   C
     / \ / \
    D  E F  G

现在求:

后序 = 左 → 右 → 根


左子树 B:

复制代码
D E B

右子树 C:

复制代码
F G C

最后根 A:

复制代码
A

合起来:

复制代码
D E B F G C A

所以答案:

✅ A


🌟 二叉树遍历"万能口诀"

一定要让孩子背下来:

复制代码
先序:根 左 右
中序:左 根 右
后序:左 右 根

真正考试时:

先序找根,中序分左右,递归拆下去。

这句话非常重要。



⚡ 第5题:快速幂------指数很大怎么办?

本题考的是:

快速幂算法的正确认识。

本题答案是:

B。题目选项中 B 的核心意思是:快速幂把指数进行二进制拆分,把普通乘幂的乘法次数从线性级别优化到对数级别。


🐢 普通方法

比如:

复制代码
2^10

我们可以:

复制代码
2×2×2×2×2×2×2×2×2×2

需要很多次乘法。

如果:

复制代码
2^1000000000

那就惨了。

电脑:

"你让我乘十亿次?"

😱


🚀 快速幂的魔法

快速幂发现一个秘密:

复制代码
2^10

可以写成:

复制代码
2^10
= 2^5 × 2^5

而:

复制代码
2^5 = 2 × 2^4

更重要的是:

复制代码
2^10 = (2^5)^2

不断"平方",就可以快速得到结果。


🔢 为什么和二进制有关?

比如:

复制代码
13

二进制是:

复制代码
1101

也就是:

复制代码
13 = 8 + 4 + 1

所以:

复制代码
a^13
= a^8 × a^4 × a

而:

复制代码
a^2
a^4
a^8

都可以通过不断平方得到:

复制代码
a
↓ 平方
a²
↓ 平方
a⁴
↓ 平方
a⁸

是不是一下子快了很多?


⭐ 复杂度变化

普通乘法:

复制代码
O(n)

快速幂:

复制代码
O(log n)

这是非常重要的优化。


❌ 其他说法为什么错?

A:可以处理任意负指数

普通整数快速幂并不能直接这样说。

例如:

复制代码
2^-3

结果是:

复制代码
1/8

这已经不是普通整数幂运算的范畴了。


C:只能模质数时使用

错误。

快速幂本身并不要求模数必须是质数。

例如:

复制代码
long long quickpow(long long a, long long n, long long mod)

mod 不一定是质数。


D:空间复杂度通常很大

也不对。

普通快速幂只需要几个变量。

所以空间复杂度通常是:

复制代码
O(1)


🍀 第6题:杨辉三角------数字藏着组合数学的秘密

题目:

杨辉三角中,第 7 行第 _3 个数,行、列均从0开始计数,是多少?

答案:

B、 35。

这题最关键的是:

⚠️ 一定看清楚"从几开始计数"!


🔺 杨辉三角长什么样?

复制代码
        1
       1 1
      1 2 1
     1 3 3 1
    1 4 6 4 1
   1 5 10 10 5 1

规律:

两边永远是:

复制代码
1

中间的数:

上面左边 + 上面右边

例如:

复制代码
      1   3   3   1
       ↓   ↓
       3 + 3 = 6

下一行就是:

复制代码
1 4 6 4 1

🎯 杨辉三角其实就是组合数

如果采用从 0 开始编号:

复制代码
第 n 行第 k 个

就是:

C(n,k)

本题为:

复制代码
第7行

实际上就是:

cpp 复制代码
C(7,0)
C(7,1)
C(7,2)
C(7,3)
C(7,4)
C(7,5)
C(7,6)
C(7,7)

也就是:

复制代码
1 7 21 35 35 21 7 1

🧠 同学们一定注意

题目如果说:

"从 0 开始计数"

和:

"从 1 开始计数"

结果会完全不同。

例如:

复制代码
从0开始:

第0行:1
第1行:1 1
第2行:1 2 1

所以看到杨辉三角题,第一件事:

🚨 先看编号从 0 还是从 1 开始!

这是非常典型的考试陷阱。



📐 第7题:长方形------把文字变成数学式子

题目:

一个长方形的长是宽的若干倍,周长为若干,求面积。

本题答案:

C 、108

虽然题目中的具体数字在文件文本提取时丢失了,但解题方法非常明确。


🧩 第一步:设宽

假设:

复制代码
宽 = x

题目说:

长是宽的 k 倍

所以:

cpp 复制代码
长 = k * x

📏 第二步:使用周长公式

长方形周长:

cpp 复制代码
周长 = 2 * (长 + 宽)

所以:

cpp 复制代码
P = 2 * (k*x + x)

提取 x:

cpp 复制代码
P = 2 * (k + 1) * x

因此:

cpp 复制代码
x = P / [2*(k+1)]

宽 = 48 / [2 * ( 3+1 ) ] = 6

🎯 第三步:求面积

面积:

复制代码
S = 长 × 宽

所以:

cpp 复制代码
S = kx²

把刚刚求出来的 x 代进去即可。

cpp 复制代码
S = kx²

S = 3 * 6 * 6 = 108

🌟 同学们看到"长是宽的几倍"

马上可以这样写:

复制代码
宽 = x
长 = kx

看到"周长":

复制代码
2 × (长 + 宽)

看到"面积":

复制代码
长 × 宽

这就是一道非常标准的:

文字 → 数学模型 → 公式计算

题。


🏆 前7题知识点

把这7道题放在一起,其实是在考一整套"算法大脑":

题号 核心知识 小朋友记忆法
1 枚举、整除、数字排列 三位数,别重复,再查整除
2 圆排列、捆绑法 相邻就捆起来
3 合并石子、最优策略 合并顺序影响总成本
4 二叉树遍历 先序找根,中序分左右
5 快速幂 指数二进制,平方往前冲
6 杨辉三角、组合数 先看从0还是从1数
7 数学建模 先设宽,再求长

🧠 "七关冒险口诀"

复制代码
第一关:数字城堡------枚举不能乱!

第二关:圆桌宴会------相邻先捆绑!

第三关:石子合并------顺序很重要!

第四关:二叉森林------先序找根,
        中序分左右,后序左右根!

第五关:快速魔法------二进制 + 不断平方!

第六关:杨辉宝塔------先看编号从哪里开始!

第七关:长方形王国------文字条件变公式!

相关推荐
郝学胜_神的一滴2 小时前
C++ Templates 06:搞懂模板代码的三种组织方式
c++·visual studio
C++ 老炮儿的技术栈2 小时前
sizeof操作符
c语言·c++·人工智能·mfc·c
沫璃染墨2 小时前
《Linux工程实践篇(一):认识设计模式——从日志系统看策略模式》
linux·c++·安全·设计模式·策略模式
wuminyu3 小时前
ForkJoinPool内部WorkQueue的Lock-Free数组操作以及并发任务窃取原理剖析
java·linux·c语言·jvm·c++
Zguigo3 小时前
【CUDA8】第一个CUDA C++ Kernel --vector add
java·开发语言·c++
-Marks-4 小时前
【C++编程】STL容器(二)--- vector底层模拟实现(常用接口实现 | 扩容机制 | 深浅拷贝 | 迭代器失效)
开发语言·c++·vector·内存管理·迭代器失效·vector底层模拟实现
Shadow(⊙o⊙)4 小时前
C++11并发支持库
开发语言·c++
ShineWinsu4 小时前
对于Redis:主从复制的解析
linux·数据库·c++·redis·缓存·面试·主从复制
无忧.芙桃5 小时前
C++ 并查集详解:原理、实现与应用
c语言·c++·算法·leetcode