质数求和函数中isPrime循环条件j<=num失效问题咨询
j <= num会失效,而j ** 2 <= num能正常工作? 嘿,我来帮你把这个问题掰明白~你遇到的情况其实是质数判断逻辑里的一个典型小坑,咱们一步步拆解:
先看j <= num的问题出在哪
你写的isPrime函数里,当循环条件是j <= num时,不管这个数是不是质数,最后都会返回false!
举个最简单的例子:当num=2(这是最小的质数),循环从j=2开始,j<=2成立,执行2%2===0,直接返回false——把质数误判成了非质数。
对所有数来说,当j循环到等于num的时候,num % j必然等于0,所以函数都会返回false,那你的sumPrimes自然算不出正确的质数和了。
为什么j ** 2 <= num就能正常工作?
这是质数判断的一个优化逻辑,核心原理是:
一个大于1的自然数
n如果不是质数,那它必然有一个因数小于等于√n,对应的另一个因数大于等于√n。
举个例子:比如n=15,它的因数是3和5,其中3≤√15(≈3.87),5≥√15。所以只要检查到j小于等于√n,就能确定它是不是质数——如果到这里都没找到能整除n的数,那n肯定是质数。
而且这个条件不会让j跑到num本身,所以不会触发num%j===0的错误判断,质数能正常返回true,非质数也能在循环里被及时识别。
补充:如果非要用类似j <= num的逻辑怎么改?
你可以把循环条件改成j < num,这样就不会让j等于num,比如:
function isPrime(num) { if (num <= 1) return false; // 别忘了加边界判断! for (let j = 2; j < num; j++) { if (num % j === 0) { return false; } } return true; }
但这种写法效率很低,比如判断num=1000000的时候,要循环近100万次,而用j**2 <= num只需要循环到1000次,差距非常大。
验证你的例子
用正确的isPrime函数,sumPrimes(20)应该返回2+3+5+7+11+13+17+19=77,你可以试试用j**2 <= num的版本,就能得到这个结果啦。
内容的提问来源于stack exchange,提问作者Taro Be

