你能解释一下在javascript中查找素数的方法吗 函数getPrimes(最大值){ 变量筛=[],i,j,素数=[]; 对于(i=2;i

你能解释一下在javascript中查找素数的方法吗 函数getPrimes(最大值){ 变量筛=[],i,j,素数=[]; 对于(i=2;i,javascript,algorithm,primes,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

,它被称为,它是一种寻找介于零和某个上限整数之间的所有素数的有效方法

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

j=i它使用埃拉托斯烯的筛子

来自维基百科()

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

求所有小于或等于给定整数n的素数 根据埃拉托什内斯的方法:

  • 创建从2到n的连续整数列表:(2,3,4,…,n)
  • 首先,让p等于2,第一个素数
  • 从p开始,以p的增量进行计数,并在列表中标记每个大于p本身的数字。这些数字将是p的倍数 p:2p、3p、4p等;注意其中一些可能已经 标记的
  • 在列表中找到第一个未标记的大于p的数字。如果没有这样的数字,请停止。否则,让p等于 此数字(下一个素数)并从步骤3开始重复
当算法终止时,列表中所有 这里的主要思想是p的每个值都是 素数,因为我们已经标记了所有数字的倍数 少于p


这是一个按位左移。按
1
移位将乘以
2
,因此
j=i*2
也会做同样的事情。呃,“右移而不是乘以2”的事情。最坏的情况是过早优化。(而且完全没有意义,因为任何有价值的编译器/解释器无论如何都会自动这么做。)我没有写这篇文章,所以是的,当讨论乘2和使用按位左移位之间的区别时,这里潜伏着另一个潜在的错误。按位左移位运算符产生一个有符号的32位结果()。其中,默认情况下,乘法产生双精度()“不相信……最优”:内部循环不会在i大于max的平方根后运行,因此在该点之后,外部循环只是收集素数,而不是计算额外的素数。如果将i限制为小于max的平方根,则需要与当前外部循环处于相同级别的另一个循环来收集剩余的素数,因此函数如下写的很好。一个优化是只筛选奇数,而不是偶数。我看了这个视频后明白了:D
j = i << 1