You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:41:08