我正在尝试循环一个大数字(确切地说是60亿),但我不能因为我的计算机冻结了。我怎样才能解决这个问题。我应该找到600851475143
的最大素数因子。
function prime(n) {
if (n === 1 || n === 2) return false;
if (n % 2 === 0 || n % 3 === 0) return false;
return true;
}
var n = 600851475143;
for (var i = 1, c = []; i < n; i++) {
if ((n % i === 0) && prime(i)) {
c.push(i);
}
}
我已经完成了它。我将素数存储在一个数组中。
答案 0 :(得分:2)
您的prime()
功能不符合其名称所应具备的功能。有许多有效的因子分解素数,例如尝试这个:
var x = 600851475143;
var i = 2;
var sk;
while(i <= x)
{
while (x % i == 0)
{
sk = i;
x = x / i;
}
i++;
}
console.log(sk);
输出:6857
This页面有另一个(查看源代码)功能用于分解。
答案 1 :(得分:1)
prime
函数不返回素数,而是所有那些不是1或者可以被2和3整除的正整数。
让我们再看一遍整个algorhythm。首先,请注意您不需要遍历n
,您可以停在其平方根(想一想)。
var divs = [];
if (!(n & 1)) { // Checking if n is even, using faster bit operators
divs.push(2);
while (!(n & 1)) n >>= 1;
}
var d = 3, l = Math.sqrt(n);
while (d < l) {
if (!(n % d)) {
divs.push(d);
while (!(n % d)) n /= d;
l = Math.sqrt(n);
}
d += 2; // No even numbers except 2 are prime, so we skip them
}
if (n !== 1) divs.push(n);
现在divs[divs.length - 1]
包含n
的最大素数除数,以及divs
所有素因子。