我试图通过从最大可能因素向后工作来确定数字的最大素数因子。一旦找到一个因子,我通过在原始函数中使用PrimeTest3函数来测试它是否是素数。
然而,它并没有给出我期望的数字13195的答案。当我使用'测试代码如上所示时,这通过了测试'声明,我可以看到它从找到的第一个因子(2639)跳到最后找到的因子(5),奇怪的是,当记录通过PrimeTest3传递i的结果时,它显示为false,即使它有首先传递if语句是真的。
var largestPrimeFactor3 = function (num) {
function PrimeTest3(a){
if (a<=1 || a%1!=0)
return false;
limit = Math.ceil(Math.pow(a,.5));
if (a%2==0 || a%3==0)
return false;
if (a==2 || a==3)
return true;
for (i=6;i<limit;i+=6){
if (a%(i-1)==0)
return false;
if (a%(i+1)==0)
return false;
}
return true;
}
for(var i = Math.floor(num/2); i>0; i--){
console.log(i);
if(num % i === 0 && PrimeTest3(i)){
console.log('this passed the test:' + PrimeTest3(i));
return true;
}
}
}
console.log(largestPrimeFactor3(13195));
非常感谢任何帮助或澄清。谢谢!
答案 0 :(得分:2)
for
内的PrimeTest3
循环使用与i
中的循环相同的变量largestPrimeFactor3
。您需要使用var
声明将此变量声明为内部函数的本地变量。
var largestPrimeFactor3 = function (num) {
function PrimeTest3(a){
if (a<=1 || a%1!=0)
return false;
limit = Math.ceil(Math.pow(a,.5));
if (a%2==0 || a%3==0)
return false;
if (a==2 || a==3)
return true;
for (var i=6;i<limit;i+=6){
if (a%(i-1)==0)
return false;
if (a%(i+1)==0)
return false;
}
return true;
}
for(var i = Math.floor(num/2); i>0; i--){
console.log(i);
if(num % i === 0 && PrimeTest3(i)){
console.log('this passed the test:' + PrimeTest3(i));
return true;
}
}
}
console.log(largestPrimeFactor3(13195));
答案 1 :(得分:0)
由于您正在更改i
中PrimeTest3
的值,因此您会收到意外结果。
if(num % i === 0 && PrimeTest3(i)){ // i changed in PrimeTest3
// now i is not what it was when originally passed in PrimeTest3
console.log('this passed the test:' + PrimeTest3(i));
修复方法是改变:
for (i=6;i<limit;i+=6){
要:
for (var i=6;i<limit;i+=6){
这会将i
变量本地化,以便不会更改i
函数范围之外的其他PrimeTest3
变量。
在您处理此问题时,请limit
执行PrimeTest3
而不只是var limit = ...
,将limit = ...
本地化为ManipulationMode
。