【问题标题】:Finding the 10001st Prime Number - Project Euler [closed]寻找第 10001 个素数 - Project Euler [关闭]
【发布时间】:2013-04-18 04:00:44
【问题描述】:

我试图找到第 10,001 个素数。我看过其他人写的代码,但我不太明白它的含义。我用 JavaScript 编写了一些代码,在其中我尝试使用 Eratosthenes 筛。我不确定问题是什么。看起来它应该可以正常工作,但我得到了错误的答案。

var compute = function() {
var prime = [2,3,5,7,11,13,17,19];
for(var i=20; i<=80000;i++) {
if(i%2!==0 && i%3!==0 && i%5!==0 && i%7!==0 && i%11!==0 && i%13!==0 && i%17!==0 &&      i%19!==0) {
 prime.push(i);
  }
 }  
 console.log(prime[10000]);
};

 compute();

【问题讨论】:

  • 31*37=1147,所以 1147 不是素数,但您的条件会识别它为素数。
  • 这可以通过只检查以 1 3 7 或 9 结尾的数字而不是加一来优化。
  • @TheWeirdNerd 你会怎么做呢?
  • 从 1 开始 i 并在一个循环中递增。 2, 4, 2, 2... 一世。 e. i = 1 + 2 = 3 + 4 = 7 + 2 = 9 + 2 = 11...重复递增循环。当然,您必须修改循环的方式,但这会节省大量时间,尤其是当您到达那里并且必须进行大量计算以确认特定数字时。

标签: javascript arrays primes


【解决方案1】:

这是一个简单的方法,但是要找到百万分之一

(在某些机器中甚至是十万分之一)

你需要用超时来打破它,

或将其发送给网络工作者以防止锁定。

您只需要在收集它们时检查主要除数,

因为每个数字都是素数的乘积

或本身就是质数。

function nthPrime(nth){
    var P= [2], n= 3, div, i, limit,isPrime;
    while(P.length<nth){
        div= 3, i= 1;
        limit= Math.sqrt(n)+1;
        isPrime= true;
        while(div<limit){
            if(n%div=== 0){
                isPrime= false;
                div= limit;
            }
            else div= P[i++] || div+ 2;
        }
        if(isPrime) P.push(n);
        n+= 2;
    }
    return P[P.length-1];
}

警报(nthPrime(10001));

【讨论】:

  • 您的代码运行良好。我试图分解它以尝试理解它,但我无法做到。第二个while循环让我绊倒了。无论如何,我会给你的答案打分。
  • @TGarr 这是一个找到所有素数的 nieve 解决方案。要检查一个数字 n 是否为素数,您只需确保它不能被每个素数 { p | p &lt;= sqrt(n) } 整除。这就是该解决方案的作用。
【解决方案2】:

您的代码没有实现埃拉托色尼筛。您必须执行以下步骤(来源:http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes):

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

如果要找到第 10001 个素数,则必须选择足够大的 n,这样得到的数组至少包含 10001 个元素,然后选择第 10001 个元素作为结果。

【讨论】:

  • 是的,我真的不明白该怎么做。再次阅读埃拉托色尼筛法也确实没有帮助。必须有一个不那么复杂的答案。
猜你喜欢
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
相关资源
最近更新 更多