最小公倍数-for循环细分-javascript

时间:2018-12-30 14:53:35

标签: javascript function loops for-loop lcm

我正在FreeCodeCamp.org上学习一门课程,任务是找到“最小公倍数”。所以我想出了一个我认为可行的解决方案,并且在一定程度上做到了。然后,代码似乎崩溃了。这是我的代码:

function smallestCommons(arr) {
  arr = arr.sort((a,b) => {return a - b;});
  console.log(arr);
  var truesec = false;
  for(var a = arr[1]; truesec != true; a++){

    for(var e = 1; e <= arr[1]; e++){
      //console.log(a % e + " " + e);
      if(a % e != 0){
        truesec = false;
        break;
      }else{
        truesec = true;
      }
    }
    //console.log(truesec + " " + a);
    if(truesec == true){
      return a;
    }
  }

  return a;
}


console.log(smallestCommons([23,18]));

这应该根据他们的清单返回6056820,但是每次我检查得到不同的结果时,我都会从同一代码中得到114461122841。有人可以告诉我这是怎么回事吗?

如果有帮助,这里是作业: Intermediate Algorithm Scripting: Smallest Common Multiple

2 个答案:

答案 0 :(得分:3)

您的算法尝试执行的操作是找到1到数组中较大数字之间的公倍数 ,这可能需要很长时间。但是,来自FreeCodeCamp的问题要求您找到数组中两个数字之间的公倍数 ,因此从您的算法计算出的结果与测试不匹配。

要使您的解决方案有效,您可以进行更改

来自for (var e = 1; e <= arr[1]; e++)

for (var e = arr[0]; e <= arr[1]; e++)

以便在数组中的两个数字之间循环。

答案 1 :(得分:0)

对于这个问题,我将采用另一种方法:

  1. 创建函数以获取所有主要因素
  2. 创建介于a[0]a[1]之间的所有素数的素数数组
  3. 将阵列减小为每个素因数的最大功效。
  4. 将数组中剩余的所有素数乘以

当答案为{{1}时,您的方法将采用O(k*a[1])-并且k可能会很高...此方法将采用k

考虑以下代码:

O((a[1])^2)

此代码将在几秒钟内输出function smallestCommons2(arr) { arr.sort((a,b) => {return a - b;}); let factors = []; for(let i = arr[0]; i <= arr[1]; i++) factors.push(findPrimeFactors(i)); let reduced = reduceFactors(factors); let ans = 1; for (let i in reduced) ans *= Math.pow(i, reduced[i]); return ans; } function reduceFactors(factorsArr) { let factorObject = {}; for (let i in factorsArr) { for(let key in factorsArr[i]) { if (!(key in factorObject) || factorObject[key] < factorsArr[i][key]) factorObject[key] = factorsArr[i][key]; } } return factorObject; } function findPrimeFactors (num) { var primeFactors = []; while (num % 2 === 0) { primeFactors.push(2); num = num / 2; } var sqrtNum = Math.sqrt(num); for (var i = 3; i <= sqrtNum; i++) { while (num % i === 0) { primeFactors.push(i); num = num / i; } } if (num > 2) primeFactors.push(num); let factorObject = {}; for (let item of primeFactors) { if (item in factorObject) factorObject[item] += 1; else factorObject[item] = 1; } return factorObject; } console.log(smallestCommons2([23,18]));

已编辑-找到了post,可以更好地完成相同的操作