GESP 二级 · GESP 202312 C++ 二级 第 11 题

选择题 · 答案 C · 考点:循环控制

← 整套速查表 GESP 二级 全部真题

题目

以下 C++ 代码用于输出 $1\sim 100$(含)的整数平方数(完全平方数),如 $16$ 是 $4$ 的平方,横线处应填写( )。

for (i = 1; i < 100 + 1; i++)
    if (__________________)
        cout << i << " ";
答案:C

考点

循环控制

解题思维

这道题考查完全平方数的判定。拿到题先想:平方数就是某个整数自乘得到的数。循环里i从1到100,只要判断i是否等于某个整数的平方即可。用sqrt取整再平方比对,是最稳妥的写法。

常见错误

很多考生看到sqrt就下意识写浮点比较,比如认为int(sqrt(i))==sqrt(i)成立,但这在浮点运算中极不稳定,且题目语境是整数域。更隐蔽的坑是混淆赋值和相等,选项A和D用单等号=,在if条件里是赋值而非比较,逻辑全错。另外循环条件i<100+1写成i<=100不影响结果,但命题人故意用这种写法迷惑那些只背模板不看边界的考生。还有部分人会忽略int(sqrt(i))本身已经取整,再乘一次int(sqrt(i))才是正确的平方还原,漏掉一个int直接写sqrt(i)*sqrt(i)会引入浮点误差。

详细解析(节选)

考点定位与命题意图

GESP二级C++模块,这道题把「循环控制」「条件判断」和「数值性质判定」揉在一起考。命题人显然想卡住两类人:一类是只背语法、不懂数学本质的,看到sqrt就只会写浮点比较;另一类是粗心大意、分不清赋值和相等符号的。把完全平方数判定放在循环条件里,就是让你一边跑一边判断,考察你在真实编程场景下对整数域运算的理解。

核心概念:什么是完全平方数?

完全平方数就是某个整数k的平方,即k×k。比如16是4的平方,9是3的平方。在C++里,没有直接判断一个数是不是完全平方数的内置函数,通常的做法是用sqrt求平方根,然后看结果是不是整数。但sqrt返回的是double,直接拿它和整数比会引入浮点误差,尤其在边界值附近(比如99.9999999 vs 100)极不稳定。所以稳妥的做法是:先取整,再平方,最后和原数比对。

解题思路推演

题目要求输出1~100之间的所有完全平方数,代码框架已经给出循环:for (i = 1; i < 100 + 1; i++)。这里i从1开始,每次加1,直到i<101,也就是i会取到100,刚好覆盖题目范围。

循环体里只有一个if条件,横线处要填的就是判断i是否为完全平方数的表达式。我们一步步想: 1. 对任意i,用sqrt(i)得到它的平方根(double)。 2. 用int()强制转为整数,得到floor(sqrt(i)),记为k。 3. 如果i真是完全平方数,那么k×k必然等于i;如果不是,k×k一定小于i(因为k是向下取整)。所以判断条件就是k×k==i。 4. 把k代回去,就是int(sqrt(i)) * int(sqrt(i)) == i。

这就是选项C的写法。

逐项分析选项(为什么其他都错)

这里用的是单等号=,在C++里它在if条件里是赋值运算符,不是比较。也就是说,这个表达式会先计算左边,然后把结果赋给i,整个if的值是赋值表达式的结果(即i的新值),永远为真(除非i被赋成0或false)。这完全违背题意,而且语法上虽然合法,但逻辑上是致命的。很多考生只看到左右两边数值相等就以为是对的,忽略了运算符的优先级和含义。

这个比较的是取整后的整数和原始的double平方根。理论上,如果i是完全平方数,两者数值相等;但实际上double有精度问题,比如sqrt(100)可能得到9.999999999999998,int后是9,9==9.999…是false,导致漏判。题目明确是在整数域判定,用浮点恒等比较既不稳健也不符合出题意图。而且这个写法在GESP二级里属于「看似合理实则陷阱」的典型。

和A一样,单等号是赋值,不是比较,逻辑全错。此外,赋值后i变成了double,类型都变了,后续cout<<i还会输出浮点格式,完全跑偏。

这是唯一正确的。先取整,再平方,最后和原数比对,整个过程都在整数域进行,没有浮点误差干扰,逻辑严密,符合题目要求。

易错点总结与避坑指南

1. 赋值vs相等:这是本题最大的坑。很多考生只关注左右两边的数值,不看运算符。记住:在if条件里,单等号=是赋值,双等号==才是比较。一旦用错,程序行为完全不可控。 2. 浮点比较的陷阱:看到sqrt就写==是本能反应,但整数判定必须用整数运算。取整后再平方比对,才是稳妥的通用写法。 3. 循环边界:题目用i<100+1,其实等价于i<=100,但命题人故意写成这种形式,就是想测试你是否真的理解循环条件,而不是机械地替换符号。如果改成i<=100,答案不变;如果改成i<100,就会漏掉100这个完全平方数,那就错了。 4. int(sqrt(i))的重复:有人会写int(sqrt(i)) * sqrt(i) == i,以为sqrt(i)已经取整了。其实sqrt(i)是double,必须两边都取整才能保证整数运算。漏掉一个int,浮点误差就会让判断失效。

考频与趋势分析

从题库数据看,「基础语法」是GESP二级的高频考点,2023年考了287题,2024年413题,2025年401题,2026年109题,呈现逐年上升后小幅回落的趋势,说明这类题依然是命题重点。而「运算符与表达式」在2023年考了91题,2024年41题,2025年61题,波动较大,但整体仍占重要位置。本题恰好落在「运算符与表达式」和「循环控制」的交叉点,属于典型的复合型考点。

「循环控制」在题库中只考了5题,覆盖2019-2024年,分赛事里GESP二级占了2题,说明这类题在二级里不算多,但一旦出现,往往就是压轴的小技巧题。2023年考了2题,2024年1题,2025年暂无数据,但从趋势看,2026年可能会继续考1-2题,保持低频但高难度的节奏。

未来预测

基于现有数据,GESP二级在2026年仍会延续「基础语法+运算符+循环」的混合考查模式。完全平方数判定这种「数学本质+整数运算」的题型,很可能会再次出现,但命题人可能会换一种包装:比如不直接给循环,而是让考生补全一个while条件,或者把sqrt换成pow函数,增加一层函数调用的复杂度。此外,也可能把判定对象换成立方数或更高次幂,考察更复杂的取整策略。

如果数据不足以支撑具体预测(比如2025年循环控制为0题),那就说明这类题在近期可能暂时减少,但作为二级核心考点,它不会消失,只是形式会变化。考生备考时,除了记住本题的写法,更要掌握「取整后幂运算比对」这一通用范式,这样才能应对各种变体。

总之,这道题看似简单,实则暗藏多个细节坑,是GESP二级非常典型的「会者不难,难者不会」的题目。掌握它,不仅能为二级拿分,也为后续更复杂的算法题打下坚实的整数运算基础。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断