如何避免这种不好的循环?

时间:2012-06-07 23:14:56

标签: javascript math

我正在尝试循环一个大数字(确切地说是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);
    }
}

我已经完成了它。我将素数存储在一个数组中。

2 个答案:

答案 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所有素因子。