Smallest Common Multiple - some Help

Smallest Common Multiple - some Help
0

#1

*What is the problem in my code?

Your code so far


function smallestCommons(arr) {
  var newArr = [];
  var max = Math.max(arr[0],arr[1]);
  var min = Math.min(arr[0],arr[1]);
  for (var i = min; i <= max; i++) { 
    newArr.push(i)
  }
  newArr = newArr.reverse();

  var commonMultiple = newArr.reduce((x,y) => x*y);
  newArr.map(function(x) {

    if(newArr.every(function(y) {

      return (commonMultiple / y) % x == 0;
    })) {
      commonMultiple = commonMultiple / x;
      console.log(commonMultiple);

    }
  })
  return commonMultiple;
}

smallestCommons([23, 18]);

Link to the challenge:
https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/smallest-common-multiple

smallestCommons([1, 5]) should return a number.
Passed

smallestCommons([1, 5]) should return 60.
Passed

smallestCommons([5, 1]) should return 60.
Passed

smallestCommons([2, 10]) should return 2520.
Passed

smallestCommons([1, 13]) should return 360360.
Passed

smallestCommons([23, 18]) should return 6056820.
Not passed


#2

This is a really odd way to do it imo, the use of map and every isn’t particularly idiomatic and quite hard to read, usually a map is over a pure function, and not one which mutates state, perhaps you meant to use a forEach instead?

The main problem is actually most likely the running time of your algorithm, it’s quite inefficient, checking many possibilities.

As a hint for what you should consider trying to reduce the complexity, the lowest common multiple of a set of numbers, LCM(a, b, c, d, ...) is equal to the lowest common multiple in pairs as follows:

LCM(a, b, c, d, ...) = LCM(..., LCM(d, LCM(c, LCM(a, b)))

Which is the exact form needed for a reduce, once you can find the lowest common multiple of two numbers!

Also there’s a great way to find the LCM via the GCD, check the wikipedia article for that and then consider implementing one of the classic algorithms for the greatest common denominator

Happy hacking!


#3

I solved it. Thank you!

my solution:

function smallestCommons(arr) {
  var max = Math.max(...arr);
  var min = Math.min(...arr);
  function gdc (x,y) {
    return y ? gdc (y , x%y) : x;
  }

  function lcm (x,y) {
    return (x*y) / gdc(x,y);
  }

  var newArr = [];
  for (var i = min; i <= max;i++) {
    newArr.push(i);
  }
  console.log(newArr);

var lcm = newArr.reduce((x,y) => lcm(x,y));

return lcm;

}


smallestCommons([1,5]);```

#4

Don’t forget to wrap your solution in spoiler tags [spoiler]Spoils here[/spoiler].