GESP 二级 · GESP 202509 C++ 二级 第 9 题

选择题 · 答案 D · 考点:算法

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

题目

阅读下面的 C++ 代码,其中变量都是整型,则说法正确的是( )。

cin >> a >> b;
while (b != 0) {
    remainder = a % b;
    a = b;
    b = remainder;
}
cout << a;
答案:D

考点

算法

解题思维

答案D。运算符是C++的重要组成部分。要区分不同运算符的使用格式和优先级。

常见错误

\=不是合法运算符。注意区分 =(赋值)、==(相等比较)、!=(不等比较)。

详细解析(节选)

【考点】欧几里得算法|取模运算|循环边界

【解题思维】代码本质是辗转相除法求 GCD。当 a=0 时,第一轮取模 0%b=0,a 被赋为原 b 值,b 变为 0 后循环终止,输出即原 b;当 b=0 时循环直接跳过,输出 a(0)。无论 b 正负,abs(b) 均与输出绝对值一致,这就是 D 项成立的数学依据。

【陷阱拆解】A 项假想"b=0 会进循环",忽略了 while(b!=0) 本身就是防除零的保护;B 项把"被除数需小于除数"的误解套用到取模上,其实 a%b 对任意 a 都合法;C 项否定负数取模,C++ 中负数取模有明确定义且算法仍收敛;D 项看似需要讨论"b 为 0 时",但此时输出 0 而 abs(0)=0 依然成立——命题人故意把"全边界情况"塞进一个选项里,只有真正理解循环逻辑的人才能一眼看穿。

【反命题思维】若把 cin 改为 a=0、b=0 直接赋值,循环条件不变,输出仍为 0,abs(b) 依旧匹配;若把代码改成先交换 a、b 再执行,对 a=0 的情况输出会变,但 abs(b) 结论仍成立——这类题刷到先问:"循环条件是否已经覆盖了所有极端输入?"

同考点真题

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