使用while循环实现JavaScript最小公倍数遇问题求助
问题分析与代码修正:计算整数范围的最小公倍数
我看了你的代码,问题出在几个关键的逻辑顺序和变量更新的错误上,导致要么无限循环,要么只执行一次循环就终止。咱们一步步拆解问题:
核心错误点
- modSum 未实时更新:你只在循环开始前计算了一次
modSum,之后每次循环更新modulus数组后,并没有重新计算modSum的值。所以modSum一直是初始的1,导致while (modSum !== 0)的条件永远为真,不加break就会无限循环。 - 错误的break语句:你在循环里添加的
break完全破坏了逻辑——只要第一次判断modSum !==0(而它确实一直是1),就会执行common += max然后直接跳出循环,所以循环只跑了一次,common变成26就返回了,这显然不符合需求。 - 循环内逻辑顺序混乱:你应该先计算当前
common对应的余数数组,再计算余数的和,最后判断和是否为0。如果不为0,就累加max继续尝试;如果为0,就说明找到了最小公倍数,退出循环。
修正后的代码
function smallestCommons(arr) { var numBetween = []; var max = Math.max.apply(Math, arr); var min = Math.min.apply(Math, arr); // 生成从min到max的所有整数数组,逻辑更直观 while (min <= max) { numBetween.push(min); min += 1; } var common = max; while (true) { // 计算当前common对所有数的余数数组 var modulus = numBetween.map(num => common % num); // 计算余数总和,总和为0说明能被所有数整除 var modSum = modulus.reduce((a, b) => a + b, 0); if (modSum === 0) { break; // 找到最小公倍数,退出循环 } common += max; // 未找到,累加max继续尝试 } return common; } // 测试用例 console.log(smallestCommons([1,13])); // 输出360360,正确 console.log(smallestCommons([7,3])); // 输出420,正确(3-7的最小公倍数是420)
关键修改说明
- 优化了生成
numBetween的循环条件,用min <= max更直观,避免原代码中max - min !== -1这种容易混淆的判断。 - 改用
while(true)循环,内部通过余数总和是否为0来控制退出,逻辑更清晰。 - 每次循环都重新计算
modulus和modSum,保证判断条件是实时有效的。 - 移除了错误的
break语句,只有找到符合条件的common时才退出循环。
内容的提问来源于stack exchange,提问作者Zsolax
相关产品推荐
相关产品推荐

