区间LCM计算JS代码在freeCodeCamp部分测试失败且无报错,求排查
问题分析与解决方案
嘿,刚学编程几个月能写出这样的逻辑已经超棒了!咱们来揪出代码里的小问题~
你的核心bug出在findGCF函数的实现上:当前你是把两个数的所有公约数相乘来得到最大公约数(GCF),但实际上GCF的定义是两个数的公约数里最大的那个,不是所有公约数的乘积。举个实际例子:
- 计算12和18的GCF时,它们的公约数是[1,2,3,6],按你的代码会算出
1*2*3*6=36,但正确的GCF应该是6。
这个错误会连锁影响后续的LCM计算,尤其是测试用例4([2,10])和5([1,13])这类包含多个有公约数数字的区间,最终导致结果偏差。
修正后的代码
我们换用更高效且正确的**欧几里得算法(辗转相除法)**来计算GCF,这是求最大公约数的标准方法:
function smallestCommons(arr) { let allNum = []; const min = Math.min(...arr); const max = Math.max(...arr); for (let i = min; i <= max; i++) { allNum.push(i); } // 欧几里得算法求最大公约数 function findGCF(a, b) { while (b !== 0) { const temp = b; b = a % b; a = temp; } return a; } // LCM公式保持不变:LCM(a,b) = (a*b)/GCF(a,b) return allNum.reduce((a, b) => (a * b) / findGCF(a, b)); }
为什么欧几里得算法可行?
它的核心逻辑是:两个数的最大公约数,等于其中较小数和两数相除余数的最大公约数,重复这个过程直到余数为0,此时的除数就是最大公约数。这个方法不仅计算准确,处理大数时的效率也比枚举因数高很多。
现在再测试你的所有用例:
smallestCommons([2,10])会返回正确的2520smallestCommons([1,13])会返回正确的360360- 之前通过的测试用例也依然能正常运行
内容的提问来源于stack exchange,提问作者YogAG
相关产品推荐
相关产品推荐

