下面 C++ 代码用于判断一个大于 $0$ 的正整数是几位数,横线处应填入代码先后是( )。
int N, cnt;
cout << "请输入大于0的正整数:";
cin >> N;
cnt = 0;
while (______){
cnt += 1;
________;
}
cout << cnt;A.
N > 1
N = N / 10B.
N > 1
N /= 10C.
N == 0
N /= 10D.
N > 0
N /= 10答案D。循环补全要分析循环变量的初始值、条件和更新方式,确保能产生目标输出。
代入法验证时注意选项之间的细微差别。循环条件中的<和<=可能导致完全不同的结果。
【考点】循环结构|整数除法|条件判断
1. 考纲定位:GESP二级C++「基础语法与算法」模块的循环控制与整数运算。命题人想卡住只会背模板的考生,因为很多人会误选A或B,把循环条件写成N>1,导致当N=1时循环不执行,cnt=0,错误。这道题是循环终止条件的经典测试,正确答案必须用N>0。
2. 解题思维:看到题先想:目标是统计位数,需要不断去掉最后一位数字,直到N变成0。关键观察:每次去掉最后一位用N/=10;循环继续的条件是N还没有减到0,所以是N>0。通法:对于任何「统计数字位数」或「逐位处理正整数」的问题,循环条件都是N>0,循环体是N/=10,计数器加一。注意顺序:先cnt+=1再N/=10,否则最后会被多算一位。
3. 陷阱拆解:选项A:把条件写成N>1,当N=1时循环不执行,cnt=0,错误。选项B:条件同样是N>1,只是写法不同,但逻辑错误一样。选项C:条件N==0会让循环永远不执行,因为初始N>0,不满足条件。选项D:唯一正确,条件N>0且用N/=10。最阴险的细节:很多学生会把「直到N变成0」理解为「直到N变成1」,从而选A,这就是命题人设的坑。
4. 反命题思维:如果把题目改成「统计负数的位数」或「统计0的位数」,答案会完全不同,循环条件要调整。例如负数需要先取绝对值,再循环N>0;零需要单独判断。提醒:刷到类似题,先问自己「命题人想考我什么」,别只看表面。