我正在尝试通过从最大可能的因子开始倒数来确定数字的最大素数。找到一个因子后,我将通过使用原始函数中的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));


非常感谢您的帮助或澄清。谢谢!!

最佳答案

由于要更改iPrimeTest3的值,因此您得到了意外的结果。

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而不是PrimeTest3var limit = ...本地化为limit = ...的范围。

关于javascript - for循环在if语句中意外中断,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29927021/

10-10 09:18