我目前正在使用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
答案 0 :(得分:0)
关于如何优化的几点:
n = 10
,则无需检查大于5的数字。如果您在Counter > Number/2
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)
(function(n) {
let i = 2
while (i <= n) {
if (n % i === 0) {
n /= i
} else {
i++
}
}
return console.log(i)
})(10)