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
相关产品推荐
相关产品推荐

