Javascript-数字的最大素数

时间:2018-10-09 20:33:03

标签: javascript

我目前正在使用javascript进行Project Euler挑战。 我正在做第三个挑战,涉及找到一个数字的最大素数,并且我的代码根据示例运行,但是当我尝试做一个更大的数字时,代码最终冻结了吗?

//Functions
function PrimeChecker(Number){
//Variables
var Counter = 2;
//Check Number
    do{
        if(Number % Counter == 0){
                if(Counter == Number){
                    return true;
                    break;
                }
            return false;
            break;
        }
        else{
            Counter++;  
        }
    }while(Counter != Number+1);
}

function FactorChecker(Number){
//Variables
var Counter = Number;
//Check Prime
do{
    console.log("Count: "+Counter);
    if(Counter==Number){
        //Nothing
    }else{
            if(PrimeChecker(Counter) == true){
                if(Number%Counter==0){
                    console.log("Pass with: "+Counter);
                    break;
                }
                else{
                    console.log("Undivisable with: "+Counter);
                }
            }
        }
    Counter--;
    }while(true);
}

//End
FactorChecker(600851475143);

在崩溃之前,它给出的最终输出为Count: 600851475067

3 个答案:

答案 0 :(得分:0)

关于如何优化的几点:

  1. 您不需要一直循环到Number。例如。如果为n = 10,则无需检查大于5的数字。

如果您在Counter > Number/2

时结束循环,这将使您的计算时间减少一半。
  1. 可以进一步优化。您甚至在n / 2之前就停止了循环。查找Number的平方根(我们将其命名为sqrt_n)。从k = 2,3,4 ... sqrt_n进行迭代,您应该会很好。

希望这会有所帮助。

答案 1 :(得分:0)

Avi Dubey's答案已经为您提供了一些有关如何优化素数检查和因子检查的重要指导,因此该答案仅向您显示如何重写代码的建议。

我只建议您在开始质数检查之前先检查数字是否可被Counter除,因为质数检查比模数技巧昂贵。

function isPrime( number ) {
  const max = Math.ceil( Math.sqrt(number) );
  for (let i = 2; i <= max; i++) {
    if (number % i === 0) {
      return false;
    }
  }
  return true;
}

function findLargestFactor( number ) {
  let counter = Math.ceil( number / 2 );
  do {
    if ( number % counter === 0 && isPrime( counter ) ) {
      break;
    }
  } while (--counter > 1);
  return counter === 1 ? 'none found' : counter;
}

console.log( isPrime(3) );
console.log( isPrime(5) );
console.log( isPrime(7) );
console.log( isPrime(11) );
console.log( isPrime(13) );
console.log( isPrime(17) );
console.log( isPrime( 600851475143 ) );

console.log( findLargestFactor( 15 ) );
console.log( findLargestFactor( 14 ) );
// this will still block (it is a huge number you are trying to compute)
//console.log( findLargestFactor( 600851475143 ) );

答案 2 :(得分:0)

  • 取最小的质因数 2 并除以它。
  • 如果提醒为 0,则可以被该质数整除,继续循环

(function(n) {
  let i = 2
  while (i <= n) {
    if (n % i === 0) {
      n /= i
    } else {
      i++
    }
  }
  return console.log(i)
})(10)