找到前100个素数

时间:2013-07-03 22:58:13

标签: javascript

我正试图找到第一个100 PRIME NUMBERS。不是1-100的素数。我需要一些关于此代码的帮助。

    var p = function(n){
    var x = Math.sqrt(n);
    if(n==2){return 2;}
    else if (n % 2===0){return 0;}
    var i=3;
    for(i=3; i < x; i+=2){
            if(n%i===0){return 0;}
    }
    return n;
};


var firstKPrime = function(k){
        var i=1;
        var arr =[];
        for(i = 1; i < k+1; i++){
                if(i==2){arr.push(p(i));}
                if(i>2 && i%2!==0){
                        if (p(i)>1){arr.push(p(i));}}
                    }
                return arr;
            };

                var fmt = function(arr){
                    return arr.join(",");

            };

            var k = 100;
            console.log("firstKPrime(" + k + ")");
            console.log(fmt(firstKPrime(k))); 

我不希望它找到1-100的素数帮助我修改这个

4 个答案:

答案 0 :(得分:7)

var first100primes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541];

合...

但严肃地说,你应该遵循以下模式:

  • 创建数组primes和整数i=1
  • primes.length < 100时,请执行以下操作:
    • 增量i
    • 对于j2之间的所有整数sqrt(i)
      • 如果i % j == 0然后继续上一轮
    • 如果你达到这一点,那么这是一个素数,所以将i推到primes

上述示例实现:

(function() {
    var primes = [2];
    window.getNprimes = function(n) {
        var i = primes.length == 1 ? 1 : primes[primes.length-1], j, l;
        main:
        while((l=primes.length) < n) {
            i += 2;
            for( j=0; j<l; j++) {
                if( i % primes[j] == 0) continue main;
            }
            primes.push(i);
        }
        return primes.slice(0,n);
    };
})();

这是我能想到的最佳状态,特别是如果你多次调用getNprimes(100),它只会在第一次计算它并且下次返回相同的结果。

答案 1 :(得分:1)

如果您不介意使用像Lazy.js这样的库,那么您可以这样做:

var first100primes = Lazy
    .generate(infiniteSequence(2))
    .filter(isPrime)
    .take(100)
    .toArray();

function infiniteSequence(start, step) {
    if (typeof start === "undefined") start = 0;
    if (typeof step === "undefined") step = 1;

    return function (i) {
        return start + i * step;
    };
}

function isPrime(n) {
    var sqrtn = Math.sqrt(n);

    for (var i = 2; i <= sqrtn; i++)
        if (n % i === 0) return false;
    return true;
}

这就是全部。如果您不想使用Lazy.js,那么您可以这样做:

var first100primes = [], n = 2;
do if (isPrime(n++)) first100primes.push(n - 1);
while (first100primes.length < 100);

function isPrime(n) {
    var sqrtn = Math.sqrt(n);

    for (var i = 2; i <= sqrtn; i++)
        if (n % i === 0) return false;
    return true;
}

请参阅演示:http://jsfiddle.net/a3mKv/

答案 2 :(得分:0)

而不是使用for(i = 1; i&lt; k + 1; i ++)
使用

j = 1;
i=2;
while(j <= k)
{
  if(i==2){arr.push(p(i));}
                if(i>2 && i%2!==0)
                {
                        if (p(i)>1)
                        {arr.push(p(i));j++;}
                }
  i++;
}

答案 3 :(得分:-1)

我会使用arr.length属性来查看已找到多少个素数并将其与参数k进行比较。

这些方面的东西:

var firstKPrime = function(k){
var i=1;
var arr =[];
while (arr.length < k)
{
    if(i == 2)
    { 
        arr.push(p(i)); 
    }

    if(i>2 && i%2!==0)
    {
        if (p(i)>1)
        {
            arr.push(p(i));
        }
    }

    i++;
}

return arr;
};