C++中isPrime()素数判断函数返回结果错误问题排查
排查isPrime()误判21为素数的常见问题
嘿,我来帮你揪出这个让21“蒙混过关”的bug!这种素数判断错误,大概率是你的isPrime()函数里的逻辑细节出了问题,我列几个最常见的坑,你对着自己的代码逐一排查:
1. 循环中提前返回的逻辑写反了
这是最容易踩的坑!很多人会不小心写成:只要找到一个不能整除当前数的i,就直接返回“是素数”。比如判断21时,第一个循环i=2,21%2=1≠0,函数直接返回1(素数),根本没机会检查i=3的情况——而3才是能整除21的关键因数!
错误示例代码:
int isPrime(int n) { if (n <= 1) return 0; for (int i=2; i*i <= n; i++) { if (n % i != 0) { return 1; // 大错特错!只要有一个i不能整除就返回素数 } } return 0; }
正确的逻辑应该是:默认假设是素数,只要找到一个能整除的i,就立刻返回非素数,循环结束后再返回是素数。
2. 循环终止条件没覆盖到所有可能的因数
如果你的循环终止条件设成了i < sqrt(n)而不是i <= sqrt(n),或者用了i < n/2但因为整数截断导致漏检?不过21的情况,sqrt(21)≈4.58,哪怕循环到i=4也会检查到i=3,所以这个概率稍低,但也要确认:
- 尽量用
i*i <= n代替i <= sqrt(n),避免浮点运算的精度误差(比如sqrt(25)是5,但有些情况下浮点计算可能得到4.99999,导致循环提前终止)
3. 特殊情况处理遗漏
比如:
- 没处理
n <= 1的情况(不过21大于1,这个不影响) - 没单独处理
n=2(唯一的偶素数),但如果你的循环从i=2开始,2会被正确判断,但如果加了偶数优化(提前排除所有偶数),却忘了n=2的情况,会把2误判为非素数——不过这也不影响21的判断,但还是要补全。
正确的isPrime()示例
给你一个参考实现,你可以对照调整:
#include <vector> #include <iostream> using namespace std; int isPrime(int n) { if (n <= 1) return 0; if (n == 2) return 1; if (n % 2 == 0) return 0; // 提前排除所有偶数,优化效率 for (int i=3; i*i <= n; i += 2) { // 只检查奇数,减少循环次数 if (n % i == 0) { return 0; } } return 1; } int main() { int testCases; cin >> testCases; vector<int> results; for (int i=0; i<testCases; i++) { int num; cin >> num; results.push_back(isPrime(num)); } // 输出结果或者做其他处理 return 0; }
你可以先检查自己的函数是不是犯了第一种“提前返回逻辑写反”的错误,这是导致21被误判的最常见原因!
内容的提问来源于stack exchange,提问作者A.Petrov
相关产品推荐
相关产品推荐

