【发布时间】:2019-06-23 16:53:37
【问题描述】:
我正在编写代码来查找给定数字以下的所有质数之和(在这种情况下,我想找到 2000000)
我的代码对于 20000 或更低的数字可以正常运行,但是当我向它添加 0 时,它不会。
我尝试在代码沙盒上运行它,它会告诉我某处可能存在无限循环。
const isPrime = number => {
let k=0
for (let i=2; i < number; i++) {
if (number % i === 0) {
k++
}
}
if (k === 0) {
return true
} else {
return false
}
}
const sumOfPrimes = limit => {
let primeSum = 0
for (let i=1; i <= limit; i++) {
if (isPrime(i)) {
primeSum += i
}
} console.log(primeSum);
}
sumOfPrimes(2000000);
【问题讨论】:
-
"潜在的无限循环" 并不意味着你有一个无限循环,它只是意味着它运行了很长时间。这是预期的,您的算法具有平方时间复杂度。不,它不会占用内存 - 事实上,您应该使用更多内存并用它换取更好的运行时间。
-
您可以采取一些措施来加快速度。首先,您应该尽早退出 for 循环。一旦你发现它不是素数,只需返回
if (number % i === 0) return false。此外,您只需要检查一个数字的平方根。 2000000 仍然会很慢。 -
您的
isPrime非常不理想。两个简单的改进是仅在第一个遇到的因素上从for循环内迭代到Math.sqrt(number)和return false,而不是计算所有因素。如果它只有一个因数,你就已经知道它不是质数了。
标签: javascript loops