如下 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。考点: 循环结构——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)来迷惑你?