关于以下代码的说法正确的是( )。
int reversed = 0;
while (x != 0) {
int digit = x % 10;
x /= 10;
reversed = reversed * 10 + digit;
}答案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);若题目改成"反转后不溢出且保证结果非负",就还得排除负数输入。刷到这类题先问:变量类型是多少?反转结果会不会越界?