Javascript 生成素数的程序不起作用

Javascript 生成素数的程序不起作用,javascript,primes,sieve-of-eratosthenes,Javascript,Primes,Sieve Of Eratosthenes,我编写了以下代码来生成一个素数数组,直到一个数字'num'。 但它带来了完全出乎意料的结果。 我试着在chrome上调试它,但调试器没有多大帮助,因为它只是跳过了第4行 功能筛(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.forEac

我编写了以下代码来生成一个素数数组,直到一个数字'num'。 但它带来了完全出乎意料的结果。 我试着在chrome上调试它,但调试器没有多大帮助,因为它只是跳过了第4行

功能筛(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));
控制台日志(arr);
}

筛子(10)
这应该是埃拉托什尼算法的筛子吗?你知道这不是生成素数的最快方法吗

确认速度更快,它们可能是更快的解决方案。

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

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;
};

自从JSFiddle崩溃后,它就在CodePen上了

甚至我也可以通过使用循环来简化代码。但我不想用它们。但是谢谢你的算法,我会检查一下。我以为你只是想要一个简单的解决方案,但我猜你正在尝试使用lambdas。那么,一个快速提示可以接受map函数作为一个参数,而无需链接它们。另外,通过使用新数组(n)创建新数组,代码远比mroe可读,然后通过从长度对象这样做。至少对我来说是这样。你是怎么知道它可以和length对象一起工作的?我不记得我在哪里见过那个“length”对象,但我喜欢你的方法,所以下次会使用它。我已经修改了你的代码,得到了很好的结果,问题是console.log不起作用。如果您在last console.log中放置一个断点并查看该数组,那么这就是预期的解决方案。问题是我不知道为什么它不记录。此外,我将lambda分解为回调,以便更容易调试。它在代码笔中工作,添加了链接。打开CodePen控制台,编辑一个字符,它将自动运行。
numb
arra
的目的是什么?@Hassan numb用于生成arra@Hassan使用arra是因为我们必须检查它的可分割性,直到麻木为止,而不是之后。看看这个
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);