你能解释一下这种在javascript中查找素数的方法吗?

时间:2013-06-23 20:54:05

标签: javascript algorithm primes

function getPrimes(max) {
var sieve = [], i, j, primes = [];
for (i = 2; i <= max; ++i) {
    if (!sieve[i]) {
        // i has not been marked -- it is prime
        primes.push(i);
        for (j = i << 1; j <= max; j += i) {
            sieve[j] = true;
        }
    }
}
return primes;
}

我明白i会跟踪所有数字。

我不明白...... !sieve[i]j = i << 1;&amp;真正发生的事情。

只是要清楚.Prime Number是一个只能被它自己或一个整除的东西。

2 个答案:

答案 0 :(得分:4)

它被称为Sieve of Erathestenes,它是查找零和某个上限整数之间所有素数的有效方法。

j = i << 1

这是一个移位操作。它将整数1位向左移位。因为二进制是基数2,所以相当于乘以2。在十进制中,等效操作将移位,例如,1向左移动,并向右移动零。它的基数为十,所以最终得到10(十倍)。

我不相信您展示的实施是最佳的。 i值的限制可能会更低 - 例如sqrt(max)

您可以轻松地在线找到一些非常好的动画,以非常直观的方式向您展示正在进行的动画。

答案 1 :(得分:3)

它使用了Eratosthenes的筛子。

来自维基百科(http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

  

素数是一个自然数,恰好有两个不同的数字   自然数除数:1和它本身。

     

查找小于或等于给定整数n的所有素数   通过Eratosthenes的方法:

     
      
  • 创建从2到n的连续整数列表:(2,3,4,...,n)。
  •   
  • 最初,让p等于2,即第一个素数。
  •   
  • 从p开始,以p为增量进行计数,并在列表中将每个数字标记为大于p本身。这些将是倍数   p:2p,3p,4p等;请注意,其中一些可能已经存在   标记。
  •   
  • 在列表中找到未标记的第一个大于p的数字。如果没有这样的号码,请停止。否则,让p现在相等   这个数字(这是下一个素数),并从第3步重复。
  •   
     

当算法终止时,列表中的所有数字都是   没有标记是素数。这里的主要思想是p的每个值都是   素数,因为我们已经标记了所有数字的倍数   少于p。

相关问题