You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

区间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]) 会返回正确的2520
  • smallestCommons([1,13]) 会返回正确的360360
  • 之前通过的测试用例也依然能正常运行

内容的提问来源于stack exchange,提问作者YogAG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:12:50