中断语句不会中断循环

Break statement won't break the loop

本文关键字:中断 循环 语句      更新时间:2023-09-26

我想设置 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;
        }
    }
}

你只是在打破内部循环。您可以使用标签来指定要结束的循环。

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; // <== !!
        }
    }
}

如注释中所述,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);

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

  • 第一个是直接测试可分性,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,您可以使用您喜欢的欧几里得算法变体。

    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;