Break语句不会破坏循环

时间:2016-01-15 18:44:17

标签: javascript loops math

我想设置2个数字(n1和n2)的第一个最小公倍数,但我的break语句不起作用。我不想使用返回(它工作)。有办法解决这个问题吗?感谢。

var firstDayTogether,n1,n2;

for(var i=1;i<12345;i++){
    for(var j=1;j<12345;j++){
        if((s1*i)==(s2*j)){
            firstDayTogether=(s1*i);
            break;
        }
    }
}

3 个答案:

答案 0 :(得分:12)

你只是打破了内循环。您可以使用label指定要结束的循环。

outerloop: for( var i=1; i<12345; i++) {
    for( var j=1; j<12345; j++) {
        if((s1*i)==(s2*j)) {
            firstDayTogether = s1*i;
            break outerloop; // <== !!
        }
    }
}

答案 1 :(得分:2)

正如评论中所指出的,break只会从它所处的循环中断开。它不会突破嵌套循环的外层。

将嵌套循环放入函数中,然后在找到结果时自然会返回结果。

var firstDayTogether,n1,n2;

function findFirst(s1, s2) {
    for(var i=1;i<12345;i++){
        for(var j=1;j<12345;j++){
            if((s1*i)==(s2*j)){
                return (s1*i);
            }
        }
    }
}

firstDayTogether = findFirst(n1, n2);

答案 2 :(得分:1)

有一些方法可以提高效率:

  • 第一个是直接测试可分性,n2必须是LCM n1 * i的除数,因此只有一个循环且不需要标签:

    for ( var i=1; i<12345; i++) {
        if((n1*i) % n2 == 0) {
            firstDayTogether = n1*i;
            break;
        }
    }
    
  • 第二个改进就是应用数学

      

    LCM(n1,n2)= n1·n2 / GCD(n1,n2)

    对于GCD,您可以使用首选的Euclids算法变体。

    var a=n1;
    var b=n2;
    while(b!=0){ var r=a%b; a=b; b=r; }
    firstDayTogether = n1*n2/a; 
    

第一个变体甚至更短,没有休息:

    var i;
    for (i=1; (n1*i) % n2 != 0; i++) { }
    firstDayTogether = n1*i;