使用Eratosthenes筛选的Primes总和无法找到bug

时间:2016-07-14 23:26:15

标签: javascript sum primes sieve-of-eratosthenes

我在JavaScript中工作,这有点令人困惑,因为代码返回正确的素数总和。它正在使用更多的数字。有一个错误,对于977,它返回976的素数之和,即72179,而不是977的总和,即73156.到目前为止,我测试的所有内容都已正确回归。

function sumPrimes(num) {

    var sum = 0;
    var count = 0;
    var array = [];
    var upperLimit = Math.sqrt(num);
    var output = [];

    for (var i = 0; i < num; i++) {
        array.push(true);
    }

    for (var j = 2; j <= upperLimit; j++) {
        if (array[j]) {
            for (var h = j * j; h < num; h += j) {
                array[h] = false;
            }
        }
    }

    for (var k = 2; k < num; k++) {
        if (array[k]) {
            output.push(k);
        }
    }

    for (var a = 0; a < output.length; a++) {
        sum += output[a];
        count++;
    }

    return sum;
}

sumPrimes(977);

1 个答案:

答案 0 :(得分:2)

问题源于你的&#34; seive&#34; Array的编号为0,但您的算法假定array[n]代表数字n

由于您希望array[n]===true表示n是素数,如果您希望将最后一项编入索引{{1},则需要Array长度978 }和表示数字array[977]

当我将977的所有实例更改为< num时,问题似乎已解决。