为什么Eratosthenes Sieve的实施不正确?

时间:2017-09-02 01:29:08

标签: javascript algorithm sieve-of-eratosthenes

目标是找到所有素数的总和直到num。我在另一篇文章中看到了相同的实现,但它也不起作用:Sieve of Eratosthenes algorithm in JavaScript running endless for large number

然而,当我用977尝试它时,解决方案也是不正确的,它返回72179,但它应该是73156.

const sumPrimes = num => {
    var numList = [];
    var output = [];
    for (var i = 0; i < num; i++) {
        numList.push(true);
    }

    for (var i = 2; i <= Math.sqrt(num); i++) {
        if (numList[i]) {
            for (var j = i * i; j < num; j += i) {
                numList[j] = false;
            }
        }
    }

    for (var k = 2; k < num; k++) {
        if (numList[k]) {
            output.push(k);
        }
    }
    var sum = output.reduce((acc, cur) => acc + cur, 0);
    console.log(output);
    return sum;
};

伪代码来自:https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

1 个答案:

答案 0 :(得分:3)

您的代码没有任何问题。它返回小于num的素数之和,小于977的素数之和为72179.您对73156的预期答案是小于或等于 977的素数之和。差异是977,因为977是素数。