程序生成素数不起作用

问题描述 投票:2回答:1

我做了以下代码来生成一个素数数组,直到数字'num'。但它给出了意想不到的结果。我尝试在chrome上调试它,但调试器没有多大帮助,因为它只是跳过了第4行。

function Sieve(num) {
  var arr =  Array.from({length:num-1}).map((x,i)=> i+2);
  var numb = Math.floor(Math.sqrt(num));
  var arra = Array.from({length:numb-1}).map((x,i)=> i+2);
  arra.forEach(x => arr = arr.filter(y => ((y%x)!==0)||(y=!x)));
  console.log(arr);
}
Sieve(10)
javascript primes sieve-of-eratosthenes
1个回答
2
投票

这应该是Eratosthenes算法的Sieve吗?只是要提一下,你知道这不是生成质数的最快方法吗?

Bersteins's primegen被证实更快,它们可能是更快的解决方案。

除此之外,让我们为您要实现的目标显示简单的代码:

var eratosthenes = function(n) {
// Eratosthenes algorithm to find all primes under n
var array = [], upperLimit = Math.sqrt(n), output = [];

// Make an array from 2 to (n - 1)
for (var i = 0; i < n; i++) {
    array.push(true);
}

// Remove multiples of primes starting from 2, 3, 5,...
for (var i = 2; i <= upperLimit; i++) {
    if (array[i]) {
        for (var j = i * i; j < n; j += i) {
            array[j] = false;
        }
    }
}

// All array[i] set to true are primes
for (var i = 2; i < n; i++) {
    if(array[i]) {
        output.push(i);
    }
}

return output;
};

这更易于理解和分割。

顺便说一下,你知道Array.from(new Array(n-1), (x,i) => i+2);有效吗?没有必要array.from()然后.map(),你可以直接将map函数作为参数传递给。使用新的Array(n)代码也更具可读性。

这是使用您的原则的解决方案。

function Sieve(num) {
  var arra =  Array.from(new Array(num-1), (x,i) => i+2);
  var comb = Array.from(new Array(Math.sqrt(num)-1), (x,i) => 2+i);

  comb.forEach(x => arra=arra.filter(y => (y%x !== 0) || (y===x) ));
  console.log(arra);
}
Sieve(100);

自JSFiddle破解以来,它就在CodePen上。 labda solution to Erathostene's sieve

© www.soinside.com 2019 - 2024. All rights reserved.