GESP 二级 · GESP 202606 C++ 二级 第 24 题

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

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

题目

如下 C++ 代码执行时如果输入正整数,其输出将是输入的正整数。

int N;
cin >> N;
int i = 0, Nbase = 1;
int rst = 0;
while (N != 0) {
    rst = rst + N % 10 * Nbase;
    N /= 10, Nbase *= 10;
    i += 1;
}
cout << rst;
答案:A

考点

循环控制

解题思维

答案A。考点: 循环结构——for/while的执行与嵌套。

常见错误

关键提醒:C++中的^是异或运算符,不是乘方!2^5=7而非32。这是最高频的错误。

详细解析(节选)

【考点】循环控制|整除取余运算|变量状态跟踪

考纲定位:本题直击 GESP 二级"循环控制"模块的必考能力——while 循环的变量初始化、条件判断与循环体执行顺序。命题人卡住的是那些只会写 for 循环、对 while 循环的"先初始化、再判断、后执行"流程一知半解的考生,以及把"数字位值还原"(rst = rst + 个位×10^i)当成死记硬背结论而非理解本质的选手。

解题思维:先模拟执行——输入 N,rst=0, Nbase=1;每次循环取出 N 的个位(N%10)乘上当前的 10 的幂次(Nbase),累加到 rst,然后 N/=10 去掉个位,Nbase*=10 准备下一位权重。这个"逐位提取 + 位权还原"的操作,本质上就是十进制数展开公式 N = Σ (digit_i × 10^i) 的代码实现。i 的累加是命题人放的干扰变量(代码里从未用到 i),真正关键的是 Nbase 的初始化、乘法更新与 rst 的累加顺序。

陷阱拆解:选项 B"错误"的陷阱设计得很阴险——它假设 rst 的计算顺序(先加后乘)或 Nbase 的初始化有问题。实际上 C++ 运算符优先级保证了 N%10 * Nbase 先计算,再与 rst 相加,完全正确。更隐蔽的陷阱是边界条件:题目限定"输入正整数",所以 N=0 不会进入循环,即使 rst 初始为 0 也不会影响结果。命题人利用的就是考生对"正整数"这一约束的忽视——如果题目改成"任意整数",负数输入会导致 rst 计算错误(因为 N%10 在负数时的符号问题)。

反命题思维:如果把"其输出将是输入的正整数"改成"其输出将是输入数字的各位数字之和",那么 rst 的初始化仍是 0,但循环体中应改为 rst = rst + N%10(去掉 Nbase 乘)。刷到这类题时先问自己:命题人到底在考循环的哪一环?变量初始化?条件判断?循环体执行顺序?还是故意抛出一个看似必要实则多余的变量(如本题的 i)来迷惑你?

同考点真题

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