GESP 一级 · GESP 202512 C++ 一级 第 21 题

判断题 · 答案 B · 考点:循环控制

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

题目

下面的 C++ 代码能用于判断输入的正整数是否为对称数。所谓对称数是指从左到右和从右到左读该数,其值相同,$121$ 或 $414$ 等是对称数,而 $123$ 不是对称数。( )

int n, new_number;
cout << "请输入正整数:";
cin >> n;

new_number = 0;
while (n != 0){
    new_number = new_number * 10 + n % 10;
    n /= 10;
}

if (n == new_number)
    cout << "对称数";
else
    cout << "非对称数";
答案:B

考点

循环控制

解题思维

答案B。if-else可以嵌套,if子句和else子句都可以嵌套if-else。else与最近的未匹配if结合。

常见错误

else与最近的未匹配且未加花括号的if结合。建议用花括号明确层次。

详细解析(节选)

【考点】数字反转|循环控制|条件判断

考纲定位:GESP 一级第 4 章 循环控制中'数字运算'小节,考察通过循环反转整数。它卡住 80% 考生的弱点:循环后变量被修改却继续比较,忽视 n 被还原为 0,导致非零输入永远误判。命题人特意用'正整数'约束来暴露学生是否记得 n 的初始值,这是 GESP 一级常见的'变量状态陷阱'。

解题思维:正确链是复制原数到新变量再反转。先存 original = n,用 while 循环 new_number = new_number*10 + n%10; n/=10,最后比较 original 与 new_number。关键观察:循环结束后 n 必为 0,必须保留原值才能判断对称性。每一步都有依据:n%10 取个位,n/=10 去个位,new_number*10 左移,这是构建反转数的标准方法。注意 n 为 0 时循环终止,确保所有位都被处理。

陷阱拆解:代码漏洞在于循环后 n 已归零,if (n == new_number) 只对输入 0 成立,违背'正整数'约束。这是'变量复用后比较'的典型陷阱;很多学生只看到反转逻辑,没留意 n 被破坏,导致答案选 A。命题人还利用绝对化表述'对称数'来诱导学生忽略边界条件(0 不是正整数)。

反命题思维:若比较原数与反转数,答案翻转为 A。修改输出提示处理负数也会改变逻辑。核心教训:循环后务必追踪变量状态,否则任何看似正确的逻辑都会崩溃。刷到类似题先问'命题人想考我变量还是考我逻辑?'

同考点真题

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