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