找到第10001个素数 - 项目欧拉

时间:2013-04-18 04:00:45

标签: javascript arrays primes

我想找到第10,001个素数。我看过人们写过的其他代码,但我真的不明白这意味着什么。我在JavaScript中编写了一些代码,其中我尝试使用Sieve Of 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();

2 个答案:

答案 0 :(得分:3)

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

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

你需要超时斩断,

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

你只需要在收集时检查主要除数,

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

或者本身就是素数。

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

答案 1 :(得分:2)

你的代码没有实现Eratosthenes的筛子。您必须实施以下步骤(来源: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开始重复。
  5. 如果要查找第10001个素数,则必须选择n足够大,以便结果数组包含至少10001个元素,然后选择10001st元素作为结果。