我正试图找到第一个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的素数帮助我修改这个
答案 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
j
和2
之间的所有整数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;
}
答案 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;
};