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是一个只能被它自己或一个整除的东西。
答案 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。