【问题标题】:Program to generate primes not working生成素数的程序不起作用
【发布时间】:2018-06-01 18:01:12
【问题描述】:

我编写了以下代码来生成一个素数数组,直到一个数字“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)

【问题讨论】:

  • numbarra的目的是什么?
  • @Hassan numb 用于生成arra
  • @Hassan arra 被使用,因为我们必须检查它的可分性,直到麻木而不是在那之后。看看这个en.wikipedia.org/wiki/Sieve_of_Eratosthenes

标签: javascript primes sieve-of-eratosthenes


【解决方案1】:

这应该是埃拉托色尼筛法吗?顺便提一下,你知道这不是生成素数的最快方法吗?

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) =&gt; i+2); 有效吗?不需要array.from().map(),可以直接将map函数作为参数传入from。同样使用新的 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

【讨论】:

  • 即使我可以通过使用循环来简化我的代码。但我不想不使用它们。但是感谢该算法,我会检查一下。
  • 我以为您只是想要一个简单的解决方案,但我猜您正在尝试使用 lambdas。好吧,那么一个快速提示 - from 可以接受 map 函数作为参数,无需链接它们。此外,通过使用新的 Array(n) 代码创建新数组,然后通过长度对象执行此操作,则可读性更远。至少对我来说。你是怎么知道它适用于长度对象的?
  • 我不记得我在哪里看到那个“长度”的,但我喜欢你的方法,所以下次会使用它。
  • 我已经修复了你的代码,我得到了很好的结果,问题是 console.log 没有工作。如果您在最后一个 console.log 中放置一个断点并查看该数组,这是可以预期的,一个解决方案。问题是我不知道为什么它没有记录。此外,我将 lambdas 分解为回调,以便更容易调试。 jsfiddle.net/r1bubaq2
  • 它在 codepen 中工作,添加了链接。打开 CodePen 控制台,编辑一个字符,它会自动运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多