-3

我试图找到前 100 个质数。不是 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

4 回答 4

8
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
    • 对于和j之间的所有整数: 2sqrt(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)多次调用,它只会在第一次计算它,并且下次返回相同的结果。

于 2013-07-03T23:13:16.160 回答
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/

于 2013-07-04T02:23:57.283 回答
0

而不是使用 for(i = 1; i < 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++;
}
于 2013-07-03T23:06:50.313 回答
-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;
};
于 2013-07-03T23:05:11.003 回答