下面 C++ 代码用于判断 $N$ 是否为质数(只能被 $1$ 和它本身整除的正整数)。程序执行后,下面有关描述正确的是( )。
int N;
cout << "请输入整数:";
cin >> N;
bool Flag = false;
if (N >= 2){
Flag = true;
for (int i=2; i < N; i++)
if (N % i == 0){
Flag = false;
break;
}
}
if(Flag)
cout << "是质数";
else
cout << "不是质数";答案C。逐行追踪代码:从main开始,记录每个变量的值变化。注意循环的起止条件和累加过程。
逐行模拟时建议画表格记录变量值的变化过程,特别是循环体中的变化。
【考点】条件语句|循环语句|程序逻辑跟踪
🎯 考纲定位 本题考查《GESP 一级大纲》中的条件语句与循环语句综合应用。命题人设置此题,意在卡住初学者对 for 循环边界条件的理解——很多学生只背"质数判断用循环",却忽略了 i < N 在 N=2 时会让循环体一次都不执行。
🧠 解题思维 看到题先想逻辑链:Flag 初值为假,若 N≥2 则先置为真,随后循环检查 2 到 N-1 是否有因子。若发现因子立刻置假并跳出。关键点在于循环条件 i < N——当 N=2 时,i 从 2 开始,2 < 2 为假,循环体一次都不执行,Flag 保持为真,因此输出"是质数"。通法是:判断质数时,循环范围必须是 2 到 N-1(含 2,不含 N),N=2 是特例,循环不跑但结论成立。
🪤 陷阱拆解 逐个选项拆解:A 项说输入负数可能输出"是质数",错。N<2 时 if 不执行,Flag 保持初值 false,必然输出"不是质数"。B 项说输入 2 输出"不是质数",错,因为循环条件 i < N 在 N=2 时直接不成立,循环体一次都不跑,Flag 仍为 true。D 项说把 if 改成 N > 2 就能正确判断,错,那样 N=2 会被判为"不是质数",反而漏掉最小的质数。C 项正确,这正是命题人挖的第一个坑——绝对化表述"循环不起作用",很多学生看到循环没跑就以为没检查过因子,却忘了 Flag 已在 if 里被置为 true,循环没跑反而保留了正确的初始状态。
🔄 反命题思维 站在命题人视角:如果把循环改成 i <= N,N=2 就会多跑一次 i=2 的整除判断,Flag 被置假,答案全翻;如果 if 条件改成 N > 2,N=2 直接被判非质数,质数最小值就丢了。刷到类似题,先问自己"命题人想考我什么":循环边界还是 if 条件?别被"没跑循环"的表面现象带偏。