下面 C++ 代码用于判断 $N$(大于等于 $2$ 的正整数)是否为质数(素数)。下面对如下代码的说法,正确的是 ( )。
cin >> N;
for(i = 2; i < N/2; i++)
if(N % i == 0) {
cout << N << " 不是质数";
break;
}
if(i >= N/2)
cout << N << " 是质数";这题核心就是看循环边界有没有把'N/2'这个关键数包含进去。记住,质数判断只需试除到N/2,但代码里用的是i<N/2,正好漏掉了N/2本身,导致偶数4、6等直接误判。
学生最容易觉得'试除到N/2'就够了,就选A。其实C++里i<N/2意味着i最大只能取到N/2-1,比如N=4时i最大是1,连2都没试,4%2=0这步直接跳过了。还有人会纠结break的作用,觉得删掉break就能覆盖边界(选C),但删掉break后循环还是会停在N/2-1,最后判断i>=N/2永远不成立,质数反而全被判成合数了。
这道题考的是「素数判定算法的边界条件」。核心观察是:若 N 有因子,必有一个 ≤ N/2(因为若两个因子都 > N/2,乘积就会 > N)。因此循环只需遍历 2 到 N/2 范围内的数,找到任意一个能整除 N 的数即可判定为合数。
拿到这种带循环的素数判断题,第一步先想:素数怎么判?对大于1的整数,从2开始试除,只要能整除就不是素数。试除到哪儿停?理论上是√N,但题目给的代码只写到N/2,而且没算平方根,说明命题人就是想让你盯着这个'N/2'看。