【发布时间】:2016-02-19 00:33:30
【问题描述】:
我一直在处理 Project Euler 问题,在解决问题 3 时,我遇到了一些奇怪的事情。
问题 3 要求你“找出数字 600851475143 的最大质因数”
我是这样解决的:
var search = 600851475143;
var highest = 0;
var primes = [2,3,5,7,11];
function isPrime(num) {
for (var i = 0; i < primes.length; i++) {
if (num === primes[i]) {
return true;
}
else if (num % primes[i] === 0) {
return false;
}
}
primes.push(num);
return true;
}
for (var n = 2; n <= Math.floor(Math.sqrt(search)); n++) {
if (isPrime(n) && search % n === 0) {
highest = n;
}
}
console.log(highest);
这花了 7534.188ms 这实际上是我的第二个版本的程序。
在第一个版本中,唯一的区别是在 isPrime 函数中声明的 for 循环中
i <= primes.length
当此更改到位时,程序花费了 72084.540 毫秒
从大约 8 秒增加到大约 72 秒,慢了 9 倍。
我不认为额外的迭代会导致时间增加。我最初的想法是,因为它正在寻找一个不存在的索引,但这肯定会使程序崩溃,而不仅仅是让它运行得更慢。
有人对此有任何见解吗?
【问题讨论】:
-
因为search的值很大。您的循环使用 search 的值作为延续。你认为你在 n 等于搜索的 sqrt 之前增加了多少次?
-
“问题 3 要求您“找出数字 600851475143 的最大素因数””您是否尝试过从数字本身开始迭代?
-
我无法找到从数字本身迭代的方法,因为 isPrime 函数需要所有先前的素数才能找到下一个。它是埃拉托色尼筛法的一种应用。
标签: javascript arrays for-loop