如何在JavaScript中同时创建数组并遍历直至找到公倍数
解决JavaScript中动态生成倍数数组直到找到共同值的问题
我懂你的困扰——要是得动态生成两个倍数数组,直到找到第一个共同的公倍数,确实没法提前预估循环要跑多少次,预先生成固定长度的数组既浪费内存,还可能一不小心漏掉目标值。其实我们完全不用先把数组都建好,有几种更灵活的方案,终止条件也非常明确:
方案1:不生成数组,直接跟踪当前倍数(最高效)
找公倍数本质上就是找两个数的倍数序列中第一个相等的数,完全不需要存储所有之前的倍数。我们可以分别跟踪两个数的当前倍数,每次把较小的那个往上加,直到两者相等——这就是终止条件!
// 定义我们要找公倍数的两个数 const num1 = 3; const num2 = 5; // 初始化各自的第一个倍数 let current1 = num1; let current2 = num2; // 循环直到两个当前倍数相等 while (current1 !== current2) { // 谁小就把谁加一个底数,逼近目标 if (current1 < current2) { current1 += num1; } else { current2 += num2; } } console.log("找到的第一个公倍数:", current1); // 输出 15
这种方法没有额外的数组存储,时间复杂度也很低,是最优解。
方案2:必须生成数组时的动态构建法
如果你的场景需要保留生成的所有倍数数组,那我们可以每次往数组里添加下一个倍数,然后实时检查是否出现共同值,一旦找到就终止循环:
const num1 = 3; const num2 = 5; const arr1 = []; const arr2 = []; let commonValue = null; // 循环直到找到共同值 while (commonValue === null) { // 往数组里追加下一个倍数(第一个元素直接用底数,之后用最后一个元素加底数) arr1.push(arr1.length === 0 ? num1 : arr1.at(-1) + num1); arr2.push(arr2.length === 0 ? num2 : arr2.at(-1) + num2); // 检查当前arr1的最后一个元素是否在arr2中 if (arr2.includes(arr1.at(-1))) { commonValue = arr1.at(-1); } // 反过来检查arr2的最后一个元素是否在arr1中(防止其中一个数组先抵达目标值) else if (arr1.includes(arr2.at(-1))) { commonValue = arr2.at(-1); } } console.log("找到的共同值:", commonValue); console.log("生成的数组1:", arr1); // [3, 6, 9, 12, 15] console.log("生成的数组2:", arr2); // [5, 10, 15]
这里的终止条件就是commonValue !== null,一旦找到共同值就停止循环。不过要注意,includes方法是O(n)复杂度,如果目标公倍数很大,性能会比方案1差一些。
方案3:数学公式直接计算最小公倍数(终极高效)
如果你只是需要找到最小公倍数,完全不用循环生成任何东西,用数学公式就能直接算:最小公倍数 = 两数乘积 / 最大公约数(GCD),而最大公约数可以用辗转相除法快速求得:
// 辗转相除法求最大公约数 function calculateGCD(a, b) { while (b !== 0) { const temp = b; b = a % b; a = temp; } return a; } // 计算最小公倍数 function calculateLCM(a, b) { return (a * b) / calculateGCD(a, b); } console.log(calculateLCM(3, 5)); // 15 console.log(calculateLCM(4, 6)); // 12
这种方法是效率最高的,适合只需要获取公倍数数值的场景。
内容的提问来源于stack exchange,提问作者Nicolas Hochard
相关产品推荐
相关产品推荐

