我正在尝试通过从最大可能的因子开始倒数来确定数字的最大素数。找到一个因子后,我将通过使用原始函数中的PrimeTest3函数来测试它是否为素数。
但是,它并没有给我期望的13195号答案。当我使用“ this pass the test”语句测试如上所示的代码时,我看到它正在从找到的第一个因子中跳过(2639)到找到的最后一个因子(5),奇怪的是,当记录通过PrimeTest3传递i的结果时,即使首先传递if语句必须为true,它也显示为false。
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));
非常感谢您的帮助或澄清。谢谢!!
最佳答案
由于要更改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 = ...
的范围。关于javascript - for循环在if语句中意外中断,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29927021/