我的算法是错误的还是正确的,仅需要调整?

时间:2018-07-04 14:36:27

标签: javascript arrays algorithm math

<html><head></head>
<body><script>
  function GCD(a, b) {
    if (a == 0) {
      return b;
    }
    return GCD(b % a, a);
  }

  function difference(array) {
    for (var i = Math.min(...array) + 1; i < Math.max(...array); i++) {
      array.push(i);
    }
    array.sort((a, b) => a - b);
  }

  function smallestCommons(arr) {
    difference(arr);
    console.log(arr);
    a = arr[arr.length - 1];
    b = arr[arr.length - 2];
    var LCM = a * b / GCD(a, b);
    while (true) {
      var index = arr.findIndex(element => LCM % element !== 0);
      if (index === -1) {
        return LCM;
      }
      LCM *= arr[index];
      console.log(LCM);
    }
  }
  smallestCommons([1, 5]) // right 
  smallestCommons([2, 10]) // right
  smallestCommons([1, 13]) // wrong
  smallestCommons([23, 18]) // wrong
</script></body>
</html>

这是此挑战的代码: https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/smallest-common-multiple/

我使用的算法:

1-计算两个最大数字的LCM。

2-在所有数组上尝试LCM%数字,如果找到不返回0的数字,则将其分配给var索引并乘以* * LCM然后继续这样做,直到找不到任何东西为止。而是返回-1,当发生这种情况时,最后返回LCM。

代码在前两个数组上有效,但在后两个数组上不起作用,这引起了我的思考,算法是否错误,我只是在浪费时间尝试对其进行调整,或者它是对的,它只需要一些调整?

请注意,这里有3个不同的函数,第一个函数计算GCD以便稍后计算LCM,然后第二个函数将值推入数组中两个值之间,然后对其进行排序,第三个函数计算LCM(最低公倍数) )

问题在于倒数第二个数组:

smallestCommons([1,13])返回4324320而不是360360

smallestCommons([23,18])返回72681840而不是6056820

所以我想知道的是,请专注于此:

我的整体方法(算法)是否错误,我需要重写一个整体,还是需要一些调整才能工作?

请不要给我准备好的密码。只需告诉我我想知道的内容,然后谢谢您(:

1 个答案:

答案 0 :(得分:1)

您乘以arr[index]是错误的。

为了清楚起见,请重新标记我们的变量

N =数组[索引]
p = GCD(LCM,N)

现在我们可以将 N LCD 重写为:

N = p×q
LCM = p×r

要使最小数为当前LCM和N的最小公倍数,您需要将其计算为:

LCM:= p×q×r

但是,如果您使用代码进行计算

LCM *= arr[index];

您实际上是在计算

LCM:=(p×r)×(p×q)= p×p×q×r

即一个 p 因素太多。要根据需要计算它,您应该改用以下代码:

LCM *= arr[index] / GCD(LCM, arr[index]);