找到第 n 个 Prime JavaScript

finding the nth prime javascript

本文关键字:Prime JavaScript      更新时间:2023-09-26

下面的函数应该吐出第n个质数。 然而,它不断吐出3。 有人可以帮忙吗? 干杯,安东尼

function Prime(num) {
output = true  
    for (i=2 ; i<num ; i++) {
        if (num%i === 0)  {
           output = false ; break
        }
    }
return output
}
function PrimeMover(num) {
var count = 0
    for (i=2 ; i<10000 ; i++)  {
        if (Prime(i) === true) {
            count = count + 1 
        }
        if (count === num) {
            return i
            break
        } 
    }
}

您在 global scope 中创建了循环计数器i,因此PrimeMoverPrime都改变了相同的全局i。在每次迭代中,PrimeMover都会分配i=2。之后Prime分配i=2 .your i 变量的值将在 23 .use 局部循环计数器变量之间更改var i=0;

function Prime(num) {
output = true  
for (var i=2 ; i<num ; i++) { //var i=2
    if (num%i === 0)  {
       output = false ; break
    }
}
return output
}
function PrimeMover(num) {
var count = 0
for (var i=2 ; i<10000 ; i++)  { //var i=2
    if (Prime(i) === true) {
        count = count + 1 
    }
    if (count === num) {
        return i
        break
    } 
}
}

对于最小的代码爱好者,

function nthprime(n)
{
  var prime=[], i=1
  while (i++ && prime.length<n) prime.reduce((a,c)=>(i%c)*a,2) && prime.push(i)
  return prime.length?prime.pop():-1
}
[-1,0,1,2,3,5,10,100].forEach(n=>console.log(`nthprime(${n})=${nthprime(n)}`))

function main(inp) {
  var count = 0;
  for (var i = 2; i <= 100000; i++) {
   if (isPrime(i)) count = count + 1;
   if (count == inp) return i;
 }
}
function isPrime(i) {
 for (var j = 2; j < i; j++) {
  //instead of `j < i` it can be reduced using other conditions 
  if (i % j == 0) {
   return false
  }
 }
 return true
}
main(5) // any number

这可能更理想一些

function nthPrime(n) {
    var P = 0;
    function isPrime(x) {
        var isPrime= true;
        for (var d = 2; d <= Math.sqrt(x); d++) {
            if((x/d) % 1 == 0) {
                isPrime = false;
                break;
            }
        }
        return isPrime;
    }
    for (var i = 1; 0 < n; i++) {
        if(isPrime(i)) {
            P = i; n--;
        }
        // we can skip the even numbers
        if(3 <= i){
            i++;
        }
    }
    return P;
}

试试这个

var pos=10001;
console.log(primeNumforPos(pos));
function primeNumforPos(pos){
  var num=2,curPos=0;
  while(curPos<=pos){
    if(isPrime(num)){
      curPos++;
    }
    if(curPos==pos){
      return num;
    }else{
      num++;
    }
  }
}
function isPrime(num){
  for(var i=2;i<=Math.sqrt(num);i++){
    if(num%i==0){
      return false;
    }
  }
  return true;
}

所以,我决定优化代码(为什么不呢)。它几乎是ppseprus的6倍(297ms与nth_prime(100000)中的1773ms)。

let primes = [2, 3]; 
const nth_prime = (n) => {
    if (n <= primes.length) return primes[n - 1]; // handle values which have been cached
    let i = 1; 
    
    while (1){
        const a = 6 * i - 1, b = 6 * i + 1, a_limit = Math.sqrt(a), b_limit = Math.sqrt(b); // the 6n - 1 and 6n + 1 rule for primes
        let a_prime = true, b_prime = true; 
        i++; 
        
        // prime check
        for (const prime of primes){
            if (prime > a_limit) break; 
            if (a % prime == 0){
                a_prime = false; 
                break; 
            }
        }
        
        if (a_prime){
            if (primes.length + 1 == n) return a; 
            primes.push(a); // cache
        }
        
        for (const prime of primes){
            if (prime > b_limit) break; 
            if (b % prime == 0){
                b_prime = false; 
                break; 
            }
        }
        
        if (b_prime){
            if (primes.length + 1 == n) return b; 
            primes.push(b); // cache
        }
    }
}
const findPrime = num => {
let i, primes = [2, 3], n = 5
const isPrime = n => {
    let i = 1, p = primes[i],
        limit = Math.ceil(Math.sqrt(n))
    while (p <= limit) {
        if (n % p === 0) {
            return false
        }
        i += 1
        p = primes[i]
    }
    return true
}
for (i = 2; i <= num; i += 1) {
    while (!isPrime(n)) {
        n += 2
    }
    primes.push(n)
    n += 2
};
return primes[num - 1]

}console.time('Time')

设 x = 查找Prime(9999)

console.timeEnd('Time')

控制台.log(X)