下面的 C++ 代码可以用于判断正整数 $N$ 的位数(即几位数,如 123 是 3 位数,12 为 2 位数)。( )
int N, N10, i;
cin >> N;
N10 = 10, i = 1;
while (1) {
if (N % N10 == N) {
printf("%d 是 %d 位数", N, i);
break;
}
i++, N10 *= 10;
}答案A。while循环先判断条件再执行,可能一次都不执行。do-while至少执行一次。
while先判断后执行,可能0次。do-while先执行后判断,至少1次。
【考点】循环控制|条件判断|变量操作
GESP 二级「循环与条件」模块第 3 个考点(代码逻辑推理)。命题人放这道题不是为了考你会不会写循环,而是卡住那些只背「位数=对数」公式却看不懂代码语义的考生——他们以为 while(1) 会死循环,或者认为 N%N10 永远不等于 N。
看到「判断位数」先联想对数,但代码用的是幂次递增。关键观察是 N%N10==N 等价于 N<N10。推理链条:初始 i=1,N10=10;每次循环若 N≥N10 则 i++、N10*=10,直到 N<N10 时输出 i。这是「用 10 的幂次逼近」的通法,可迁移到任意进制位数判断(把 10 换成 b 即可)。
错误选项 B 利用「死循环」恐惧——很多人看到 while(1) 就慌,没注意 break 确保退出。最阴险的细节是条件里 N%N10==N,绝对化表述「永远不等」是错的;还有偷换概念:当 N<N10 时,N%N10 确实等于 N,但很多人误以为取模会变小。如果你只背结论、不理解本质,就会掉进这个陷阱。
命题人视角下,若把 N 换成负数,代码会直接输出 i=1,因为负数%正数仍是负数,不满足 N%N10==N(相等条件不成立)。或者改成判断位数是否小于 3,只需在 break 前加 if(i>=3) break;这类变体都在考「条件语义」,刷到类似题时,先问自己「命题人想考我什么」。