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

JavaScript从数组提取素数存入新数组时非素数33被误判问题

错误原因

你代码的核心问题是素数判定函数primeNum里的return true位置写错了,放在了for循环内部:

循环只会执行第一轮,只要被判定的数不能被2整除,就会直接返回true,不会继续验证更大的除数。比如33除以2余1,程序就直接判定它是素数,根本不会去校验能不能被3、11整除,这就是误判的根源。

除此之外还有两个隐藏bug:

  • 当被判定数为2时,x < arrElement的条件不成立,for循环完全不执行,函数没有返回值,会默认返回undefined,导致2会被误判为非素数
  • 小于等于1的非法数值分支只打了日志,没有明确返回false,也会返回undefined导致逻辑异常
修复后的完整代码
var array = [33,23,5,7,10,20,30,12,37,2,1];
primes(array);

function primes(arr){
    var arrayLength = arr.length;
    var primeArray = [];

    function primeNum(arrElement){
        if (arrElement <= 1){
            console.log(arrElement + " is not a valid test number.");
            return false;
        }
        if (arrElement === 2) return true;
        for (var x = 2; x < arrElement; x++){
            if (arrElement % x === 0){
                return false;
            }
        }
        // 所有除数都验证完没有因数,才判定是素数
        return true;
    }

    for (var y = 0; y <= arrayLength - 1; y++){
        if(primeNum(arr[y])){
            primeArray.push(arr[y]);
        }
    }
    console.log(primeArray);
}

运行后输出结果为[23,5,7,37,2],符合预期。

可选优化点
  • 素数判定的循环上限可以改成Math.sqrt(arrElement),不需要遍历到数值本身,能大幅提升大数的判定效率
  • 可以提前排除偶数,进一步减少循环次数

内容的提问来源于stack exchange,提问作者S_Hags12

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 09:39:01