乐于分享
好东西不私藏

GESP C++ 二级:解题常用模板库(收藏即练)

GESP C++ 二级:解题常用模板库(收藏即练)

导语

很多孩子二级失分,不是因为「不会」,而是因为看不出这题属于哪一类模板一旦模板识别慢半拍,就会出现两类问题:

  • 写得出来,但写得慢;
  • 思路对了,细节容易翻车。

这篇把二级最常用模板收成一套「能背、能练、能复盘」的工具包。你不需要一次全吃下,先从高频 4 条开始就够。


一、先看总表:二级 9 个高频模板

编号
模板名称
出现强度
典型场景
T-01
数位拆解(while)
极高
数位和、统计某位、数字特征
T-02
逆序数
中高
回文判断、逆序比较
T-03
素数判断
质数筛查、区间统计
T-04
完全平方数判断
平方和、条件判定
T-05
双层枚举计数
极高
组合计数、区间双变量
T-06
图案输出(双层循环)
三角形、菱形、矩阵输出
T-07
取余周期编号
中高
周期规律、循环位次
T-08
幂次枚举
次方搜索、边界限制
T-09
数位提取(静态取位)
填空/选择中的取位代码

家长实用建议:先练 T-01 / T-05 / T-03 / T-04,这四条覆盖面最大。


二、四条最高频模板(先练这四条)

T-01 数位拆解(while)

触发词:个位、十位、数位和、是否包含某数字。核心写法

  1. int x = n;// 先备份
  2. while(>0){
  3. int d = x %10;
  4. // 处理 d
  5.     x /=10;
  6. }

最常错:忘记备份原值、漏写 x/=10


T-05 双层枚举计数(for-for)

触发词:枚举两个量、统计满足条件的组合。核心写法

  1. int ans =0;
  2. for(int i = L; i <= R; i++){
  3. for(int j = A; j <= B; j++){
  4. if(条件成立) ans++;
  5. }
  6. }

最常错:没先写清「i/j 各在枚举谁」,条件混乱。


T-03 素数判断

触发词:质数、素数个数、是否可被整除。核心写法(到 i*i<=n):

  1. bool isPrime(int n){
  2. if(<2)returnfalse;
  3. for(int i =2; i * i <= n; i++){
  4. if(% i ==0)returnfalse;
  5. }
  6. returntrue;
  7. }

最常错:循环上界写太大,或找到因子后不 break/return


T-04 完全平方数判断

触发词:平方数、平方和、开根判断。核心写法

  1. int y =(int)sqrt((double)x);
  2. bool ok =(* y == x);

最常错:直接比较浮点 sqrt(x),导致精度误判。


三、补全其余五条模板

T-02 逆序数

触发词:逆序、反转数字、回文数判断、数字倒过来是否相等。核心写法

  1. int x = n;
  2. int rev =0;
  3. while(>0){
  4.     rev = rev *10+ x %10;
  5.     x /=10;
  6. }
  7. // rev 即为 n 的逆序数
  8. // 判断回文数:if (rev == n)

最常错

  • 忘记备份原值就拿 n 直接拆,最后无法与 rev 比较;
  • 末尾有 0 的数(如 120)逆序后会丢位(rev=021=21),需要提前判断 n%10 是否为 0。

训练建议:先写出 n=1221 的手算过程(rev 每步的值),再对照代码走一遍,确认逻辑一致再提交。


T-06 图案输出(双层循环)

触发词:输出三角形、菱形、矩形、N 形、H 形、星号图案。核心写法(以直角三角形为例):

  1. int n;
  2. cin >> n;
  3. for(int i =1; i <= n; i++){// 控制行
  4. for(int j =1; j <= i; j++){// 控制列
  5.         cout <<"*";
  6. }
  7.     cout <<"\n";
  8. }

常见变体对照

图案类型
外层 i 控制
内层 j 范围
说明
左对齐三角形
行 1→n
j=1→i
每行 i 个
右对齐三角形
行 1→n
先输出 n-i 个空格,再输出 i 个 *
需要两个内层循环
矩形
行 1→n
j=1→m
固定列数 m
菱形上半
行 1→n
空格 n-i 个 + * (2i-1) 个
上半部分
菱形下半
行 1→n-1
空格 i 个 + * (2(n-i)-1) 个
下半部分

最常错

  • 空格数和星号数的关系算错(建议先手画出第1、2、3行,找规律再写代码);
  • 行末多了一个空格导致输出不对。

训练建议:遇到新图案,先用纸画出 n=4 的样子,标出每行的空格数和星号数,找出与 i 的关系式,再写代码。


T-07 取余周期编号

触发词:循环报数、第 n 个是什么、周期为 k 的规律、星期几、座位编号。核心写法

  1. // 周期为 k,编号从 1 开始
  2. int pos = n % k;
  3. if(pos ==0) pos = k;// 整除时对应最后一个
  4. // pos 即为第 n 个元素在周期内的编号(1~k)
  5. // 若编号从 0 开始更简单:
  6. int pos0 =(-1)% k;// 结果为 0~k-1

举例:7 个同学循环报数,第 22 个轮到谁?22%7=1,第 1 个同学。(若结果为 0 则是第 7 个)

最常错

  • 没有处理整除的情况,余数为 0 时直接输出 0,应输出 k;
  • 题目编号从 0 开始还是从 1 开始没有看清,导致差 1。

训练建议:先手算 n=k、n=k+1、n=2k 三个边界值,确认代码结果正确再提交。


T-08 幂次枚举

触发词:2 的幂、完全平方数的幂次形式、判断是否为某数的幂、枚举所有满足条件的幂次。核心写法

  1. // 枚举所有 base^exp <= n 的值
  2. longlong val =1;
  3. int base =2;
  4. while(val <= n){
  5. // 处理 val(当前幂次值)
  6.     val *= base;
  7. }
  8. // 判断 x 是否为 2 的幂(位运算写法)
  9. bool isPow2 =(>0)&&(&(-1))==0;
  10. // 判断 x 是否为某个整数的完全平方(见 T-04)

最常错

  • val 用 int 存储,幂次增长很快,超过 2³¹ 溢出——应用 longlong
  • 循环终止条件用 < 还是 <= 没看清题目(是否包含 n 本身)。

训练建议:碰到幂次类题目先估算上界:2³⁰ ≈ 10⁹,如果题目数据范围到 10⁹ 就用 longlong,循环最多跑约 30 次,不用担心超时。


T-09 数位提取(静态取位)

触发词:选择/填空题中出现取某一位的代码,如 n/10%10、 n%100/10,问结果是什么。核心规则

  1. 个位:%10
  2. 十位:/10%10
  3. 百位:/100%10
  4. 千位:/1000%10
  5.  k 位(从右往左,0开始):/ pow(10, k)%10

读代码技巧:遇到 n/X%Y 的形式,先算 /X(去掉低位),再算 %Y(只保留最低位),结果就是对应数位。

举例: n=4567

  • n%10=7(个位)
  • n/10%10=6(十位)
  • n/100%10=5(百位)
  • n/1000%10=4(千位)

最常错

  • 把 / 和 % 的顺序搞反—— n%10/10 永远等于 0(个位除以 10 必然为 0);
  • 题目给的是字符串形式的数字(如 strings="4567"),此时用 s[i]-'0' 取位,不用除法。

训练建议:选择题遇到此类代码,直接代入一个具体数字(如 1234)手算,不要硬背公式。


四、模板怎么用:三步而不是死记

很多孩子模板背了,但不会落地。关键在三步顺序:

  1. 先识别题型:这题更像哪条模板?
  2. 再抄骨架:先把模板主体写出来。
  3. 最后填条件:把题目规则翻成 if

一句话:先有框,再填肉。


五、家长陪练脚本(不懂代码也能用)

可以固定问三句:

  1. 「这题你先用哪条模板?」
  2. 「这条模板最容易错的点你准备怎么防?」
  3. 「如果样例过了,你还要补测什么边界?」

这比一句「你再认真点」更有效。


六、考前 7 天模板回炉计划

  • 第 1-2 天:T-01 + T-05(覆盖面最大)
  • 第 3 天:T-03 + T-04(判断类高频)
  • 第 4 天:T-06(图案输出专项)
  • 第 5 天:T-07 + T-09(选择填空易错)
  • 第 6 天:T-08 + T-02 + 复盘错题
  • 第 7 天:混合小测,强制先报模板再写代码

目标不是刷很多新题,而是把模板识别速度提上来。


小结

  • 二级题目看着散,模板并不散。
  • 先练高频四条,再补其余五条,效率最高。
  • 模板库真正的价值,不是「背代码」,而是让孩子看到题先有方向