Javascript 中断声明赢得';不要打破循环

Javascript 中断声明赢得';不要打破循环,javascript,loops,math,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;

我想设置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;
        }
    }
}
var firstdayther,n1,n2;

对于(var i=1;i而言,您仅中断内部循环。您可以使用指定结束哪个循环

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

outerloop:for(var i=1;i如注释中所述,
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);
var firstdayther,n1,n2;
函数findFirst(s1、s2){

对于(var i=1;i,有一些方法可以提高效率:

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

    for ( var i=1; i<12345; i++) {
        if((n1*i) % n2 == 0) {
            firstDayTogether = n1*i;
            break;
        }
    }
    

第一种型号更短,不间断:

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

Break语句仅中断一个循环。您有嵌套的循环,是否要同时中断两个循环?Break语句将仅中断内部for循环。如果您也要中断外部for循环,只需使用return…或通过检查条件并使用Break AGAIN来中断第二个for循环。我认为您应该使用more-efficient algo:这太酷了。你能解释一下它的功能/工作原理吗?很久没有在javascript中看到标签了。+1我不知道为什么“很久没看到东西了”a+1:通常看不到东西意味着有更好的选择。尽管如此,它确实解释了问题,并提供了一个最小的解决方案(可能是最合适的)好吧,先生,既然你感兴趣,我就解释一下。这是两件不同的事情。我喜欢他的答案。我还评论了一些我很久没有看到的东西。这个标签概念非常棒。我按照你的步骤,发现有人对此感兴趣,可以进一步研究:虽然标签答案很圆滑,但我喜欢这个答案还有一点。您的最后一个代码段不会产生与第一个代码段相同的输出。最后一个代码段应该是:
vari;for(i=1;(n1*i)%n2!=0;i++){第一个集合= n** i;< /Cord>您是正确的,结果在LCM之前包含一个步骤。用另一个变体编辑。在编辑之后它不太好。考虑“代码> n1= N2 < /CODE >的情况。为什么您实际上必须始终在循环体内重新分配<代码>第一次聚合< /代码>?中间结果不是内特的。休息(并抵消你的效率目标)。好的,另一个修正。我们永远不应该忽略琐碎的测试用例。我只是固执地将
I
保持在循环的局部。对于实际实现,我将使用GCD方法。现在,您在第一次迭代中的条件基本上读取
0%n2!=0
,这与
n2
的值无关。换句话说:仍然是doesn不起作用。实际上,在循环外部有
i
有什么不好?在ANSI C中,这是正常的方式。。。
    var i;
    for (i=1; (n1*i) % n2 != 0; i++) { }
    firstDayTogether = n1*i;