执行下面的 C++ 代码,有关说法正确的是( )【质数是指仅能被 1 和它本身整除的正整数】。
int N;
cin >> N;
bool Flag = true;
for (int i = 2; i < N; i++){
if (i * i > N)
break;
if (N % i == 0){
Flag = false;
break;
}
}
if (Flag)
cout << N << "是质数" << endl;
else
cout << N << "不是质数" << endl;答案D。if-else语句中else与最近的if配对。花括号可以改变匹配关系。
if(a=b)合法但往往不是本意!它执行赋值后判断b的值是否为0。
【考点】质数定义与判断|循环优化|边界条件处理
考纲定位:本题考查 GESP 二级"算法基础"模块中质数判断的经典陷阱。命题人卡住的是考生对"质数必须大于1"这一数学定义的机械记忆——代码默认Flag=true,对N=1或负数时循环根本不执行,却仍判定为质数。
解题思维:解题链:先看循环条件i<N,当N=1时i=2直接跳出循环;再看终止条件i*i>N,对N=2,3成立;再看取余判断N%i==0,对N=4成立。通法:任何质数判断代码必须显式处理N<2的边界,否则1会被误判为质数。
陷阱拆解:A错在默认Flag=true,N=1时循环不执行却输出"是质数";B错在负数时循环不执行仍输出"是质数";C错在N=0时同样被误判。D将Flag初始化为N>=2?true:false,确保0、1、负数直接判定非质数,再对≥2的数执行质数判断,覆盖所有整数。
反命题思维:命题人若把Flag改为N>=2?true:false,题目就变成考"质数判断的鲁棒性"而非单纯算法。刷到类似题先问:输入0或负数时程序会怎样?这才是真正区分记忆与理解的点。