这里有很多优化要做 - 快速阅读这里 (https://math.stackexchange.com/questions/889712/the-fastest-way-to-count-prime-number-that-smaller-or-equal-n/893767) 会有所帮助。
但对于初学者,您可以在代码中更改一些内容以使其更快:
第 1 步:减少外部迭代次数,因为我们知道所有偶数都是非质数。
for (let j = 3; j <= n; j += 2) {
...
}
第 2 步:通过仅迭代最大数的 Sqrt 来减少内循环。一旦我们找到一个因素,也要打破内部循环。无需迭代到最后。这两个会给你最大的胜利。
let prime = true;
for (let i = 2; i <= Math.sqrt(j); i++) {
if (j % i === 0) {
prime = false;
break;
}
}
if (prime) {
lastPrime = j;
}
第 3 步:停止计算 Math.sqrt(j),因为您已经知道之前的最大值。 sqrt 是一个(相对)昂贵的操作。我们可以通过使用先前的值来避免它。
let maxBound = 2;
let maxSquare = maxBound * maxBound;
for (let j = 3; j <= n; j += 2) {
if (maxSquare < j) {
maxBound++;
maxSquare = maxBound * maxBound;
}
for (let i = 2; i <= maxBound; i++) {
...
}
}
第 4 步:如果您只想要最大的素数,请向后走循环,并在找到一个素数后立即中断。
这是完成的程序,它应该比你的快大约 2 个数量级。请注意,虽然我为您的程序提供了一些微不足道的优化,但与您可以在此处找到的算法优化相比,这总是相形见绌:https://math.stackexchange.com/a/893767
function getMaxPrime(n) {
for (let j = n; j >= 3; j --) {
let prime = true;
for (let i = 2; i <= Math.sqrt(j); i++) {
if (j % i === 0) {
prime = false;
break;
}
}
if (prime) {
maxPrime = j;
break;
}
}
console.log(maxPrime);
}