【问题标题】:Can you explain this method of finding prime numbers in javascript你能解释一下这种在javascript中查找素数的方法吗
【发布时间】:2013-06-20 08:30:20
【问题描述】:
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 &lt;&lt; 1; 以及到底发生了什么。

只是为了清楚..素数是只能被它自己或被一整除的东西。

【问题讨论】:

标签: javascript algorithm primes


【解决方案1】:

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

j = i << 1

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

我不认为您展示的实现是最佳的。 i 值的限制可以更低——类似于sqrt(max)

你可以很容易地在网上找到一些非常漂亮的关于这个算法的动画,以非常直观的方式向你展示正在发生的事情。

【讨论】:

  • “不相信...最优”:在 i 大于 max 的平方根之后,内部循环永远不会运行,所以在那之后,外部循环只是收集素数,而不是计算额外的素数。如果将 i 限制为小于 max 的平方根,则需要与当前外部循环处于同一级别的另一个循环来收集剩余的素数,因此所写的函数可以正常工作。优化是只筛选奇数,而不是偶数。
【解决方案2】:

它使用埃拉托色尼筛。

来自维基百科 (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。

【讨论】:

  • 看完这个视频我明白了:D
猜你喜欢
  • 2010-09-15
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多