GESP 二级 · GESP 202403 C++ 二级 第 8 题

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

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

题目

下面 C++ 代码执行后的输出是?( )

int s,t,ans;
s = 2, t = 10;
ans = 0;
while (s != t){
    if (t % 2 == 0 && t / 2 >= s)
        t /= 2;
    else
        t -= 1;
    ans += 1;
}
cout << ans;
答案:B

考点

循环控制

解题思维

这题就是让你当个‘人工调试器’,手动画出 s 和 t 的变化过程。别一上来就套公式,先盯着 if 条件里的 t/2 >= s 这个边界,它才是决定能不能除以 2 的关键。

常见错误

最容易掉进两个坑:一是把 t/2 >= s 看成 t/2 > s,导致 4 不能除 2,多算一步;二是完全忽略这个条件,只要偶数就除 2,把 10→5→4→3→2 当成合法路径,结果选 D。还有同学会混淆取余和除法,在这里其实没用到取余,纯是整数除法截断,别被 if 里的符号搞晕了。

详细解析(节选)

【考点】循环控制|条件分支|整数运算边界

这题表面上看是个简单的 while 循环,其实命题人专门挖了个‘边界陷阱’。它不是让你背‘偶数除以 2,奇数减 1’的套路,而是让你在每一步都判断:除以 2 之后会不会掉到 s 以下?如果掉下去,就不能除,只能老老实实减 1。这就是为什么很多人会选错 D 或 A 的原因——他们要么漏看了条件,要么看错了符号。

我们从头模拟一遍,把 s 和 t 的变化画出来,ans 就是步数:

初始:s = 2, t = 10, ans = 0

第一轮:t = 10 是偶数,检查 10/2 = 5 是否 >= s(2)?是的,执行 t = 5,ans = 1 第二轮:t = 5 是奇数,只能减 1,t = 4,ans = 2 第三轮:t = 4 是偶数,检查 4/2 = 2 是否 >= s(2)?是的(等于也算),执行 t = 2,ans = 3 第四轮:现在 s = 2, t = 2,循环条件 s != t 不成立,退出循环。

输出 ans = 3,对应选项 B。

这里最关键的细节就是第三轮判断:很多人会误以为 4/2 = 2 小于 s(2),或者觉得等于就不行,于是把 t 减成 3,再继续减到 2,这样就会多走两步,得到 ans = 5 或 4。但题目里写的是 >=,等于也是满足的,所以 4 可以直接除 2 变成 2,直接撞上 s,循环结束。

再换个角度想,如果 s 改成 1,那 4/2 = 2 > 1,依然能除,答案就会变成 4(10→5→4→2→1)。如果改成 t/2 > s(严格大于),那 4/2 = 2 不大于 2,就不能除,只能减 1,答案就会变成 5。这说明命题人特意用 >= 来卡住那些只记‘能除就除’的同学。

从考频趋势看,‘循环控制’这个知识点在题库里一共只考了 5 题,覆盖 3 个级别,其中 GESP 二级就占了 2 题,2024 年还考了 1 题。虽然总题量不大,但这类带边界条件的循环题在 GESP 二级里属于高频陷阱,命题人喜欢用‘等于’‘越界’这种细微差别来区分学生是否真正读懂了条件。

未来预测方面,由于‘循环控制’在题库中占比极低(仅 5 题),且 GESP 二级近年(2023-2024)已有稳定出现,但数据样本太少,无法推断出更细致的出题规律或难度变化趋势。暂时只能说:这类题在 GESP 二级里仍会作为‘条件判断 + 循环’的组合坑出现,但不会频繁连续考,更多是作为综合性大题中的一个子环节。若想在考试中避开,核心心法就是:看到循环里的除法或取模,先别急着写代码,自己在草稿纸上把变量值一步步推一遍,尤其注意‘等于’‘大于’这种边界词。

总结一下,这题的答案就是 B(3 步),解题过程就是老老实实模拟循环,千万别被 if 条件里的 >= 迷惑,也别把 4 当成‘不能除’的数。

同考点真题

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