【发布时间】:2022-01-08 16:41:41
【问题描述】:
所以我正在尝试解决 Project Euler 的第三个问题,在这个问题中你必须得到一个数的最大素因数。我正在尝试这个问题via freeCodeCamp。我通过了 2、3、5、7、8 和 13195 的所有测试,但从 13195 及以上我收到了 Potential infinite loop detected on line 12. Tests may fail if this is not changed. 警告。 600851475143 的最终测试给出以下警告:
Potential infinite loop detected on line 6. Tests may fail if this is not changed.
Potential infinite loop detected on line 15. Tests may fail if this is not changed.
Potential infinite loop detected on line 12. Tests may fail if this is not changed.
还有 104441 的可怕错误答案。
我做错了什么,因为我的循环看起来不像它们会在语法方面无限运行?我在这里遗漏了什么吗?
我正在使用的代码:
const eratoSieve = (n) => {
let primes = [2, 3, 5, 7];
if (n > 7)
{
primes = [];
for (let i = 2; i <= Math.sqrt(n); i++)
{
primes.push(i);
}
}
for (let j = 0; j < primes.length; j++)
{
let currentMultiple = primes[j];
for (let k = j + 1; k < primes.length; k++)
{
if (primes[k] % currentMultiple === 0)
{
primes[k] = false;
}
}
}
primes = primes.filter(elem => elem != false);
return primes;
};
function largestPrimeFactor(number) {
let primeNums = eratoSieve(number);
console.log(primeNums);
let biggestPrime = 0;
primeNums.forEach(elem => {
(number % elem === 0) ? biggestPrime = elem : 0;
});
return biggestPrime;
}
console.log(largestPrimeFactor(13195));
提前感谢您的帮助!
【问题讨论】:
-
注意,这不是埃拉托色尼的筛子。是审判部门。真正的筛子不使用
%运算符,而且速度要快得多(但输入这么大仍然不切实际)。 -
另外,您还有一个错误,您会在每个
splice之后跳过一个数字。经典的“在迭代期间删除元素”问题。 -
@user2357112supportsMonica 我确实删除了
splice(在上面添加了我的代码的更新版本)并将其替换为primes[k] = false。 -
@user2357112supportsMonica。使用实际的筛子是not impractical here,因为我们最多只需要达到输入数字的平方根。 (而且我知道这个筛子的效率并不高,但这足以快速解决这个问题。)
标签: javascript algorithm performance primes sieve-of-eratosthenes