GESP 三级 · GESP 202509 C++ 三级 第 11 题

选择题 · 答案 D · 考点:循环结构

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

题目

关于以下代码的说法正确的是( )。

int reversed = 0;
while (x != 0) {
    int digit = x % 10;
    x /= 10;
    reversed = reversed * 10 + digit;
}
答案:D

考点

循环结构

解题思维

答案D。while循环先判断条件再执行,可能一次都不执行。do-while至少执行一次。

常见错误

while先判断后执行,可能0次。do-while先执行后判断,至少1次。

详细解析(节选)

【考点】循环结构|整数溢出|大数处理

考纲定位:本题落在 GESP C++ 三级《算法与数据结构》"循环结构"考点。命题人把"能反转任何整数"的直觉当靶子,专门卡住考生对 32 位有符号整型上限(2147483647)和溢出风险的认知盲区。

解题思维:看到题先定位变量类型——int 是 32 位有符号,取值范围[−2147483648, 2147483647]。循环里三步:digit = x % 10 取出末位,x /= 10 去末位,reversed = reversed * 10 + digit 把新位拼到末尾。注意 reversed * 10 这一步会先发生乘法,如果结果超过 2147483647 就溢出。因此能成功反转的最大原数,必须满足"反转后的结果 ≤ 2147483647"。把 2147483647 从右往左读是 7463847412,远超 int 上限;从 2147483646 开始逐个试,发现 1463847412 反转得到 2147483641,仍在范围内,再大一点就溢出。

陷阱拆解:

反命题思维:如果把 int 改成 long long,最大可反转数会跳到约 9223372036854775807 的倒序(9077547856302233729);若题目改成"反转后不溢出且保证结果非负",就还得排除负数输入。刷到这类题先问:变量类型是多少?反转结果会不会越界?

同考点真题

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