【问题标题】:for loop unintentionally breaking at if statementfor 循环无意中在 if 语句处中断
【发布时间】:2015-07-07 18:03:35
【问题描述】:

我试图通过从最大可能的因子向后工作来确定一个数字的最大素因子。一旦找到一个因子,我会使用原始函数中的 PrimeTest3 函数来测试它是否为素数。

但是,它并没有给出我所期望的数字 13195 的答案。当我使用“此通过测试”语句测试如上所示的代码时,我可以看到它正在跳过找到的第一个因素(2639) 到找到的最后一个因子 (5),奇怪的是,当记录通过 PrimeTest3 传递 i 的结果时,它显示为 false,即使首先传递 if 语句必须是 true。

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));

非常感谢任何帮助或澄清。谢谢!!

【问题讨论】:

  • 最好给我们添加一个语言标签。
  • 感谢 Jongware 的建议并感谢 Lee 的编辑!
  • 请注意:您不是从最大可能的因素向后工作。例如,3 * 17 = 51,sqrt(51) ≈ 8, 17 > 8。

标签: javascript if-statement for-loop primes


【解决方案1】:

PrimeTest3 中的for 循环使用与largestPrimeFactor3 中的循环相同的变量i。您需要使用 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));

【讨论】:

    【解决方案2】:

    因为您更改了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 变量,以不更改 PrimeTest3 函数范围之外的其他 i 变量。

    当您使用它时,将limit 本地化到PrimeTest3 的范围内,方法是执行var limit = ... 而不仅仅是limit = ...

    【讨论】:

      猜你喜欢
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      • 2019-06-09
      相关资源
      最近更新 更多