Open1

最小公倍数を求める

So-sanSo-san

問題

指定されたパラメーターに対して、両方のパラメーターで割り切れるだけでなく、これらのパラメーターの範囲内にあるすべての連続する数でも割り切れる、最小公倍数を求めてください。

範囲は 2 つの数値の配列になりますが、必ずしも数値順とは限りません。

たとえば、1 と 3 が与えられた場合は、1 と 3 の両方で割り切れ、かつ 1 と 3 の間にあるすべての数でも割り切れる最小公倍数を求めてください。 その場合の答えは 6 になります。

解答

function smallestCommons(arr) {
  const [min, max] = arr.sort((a, b) => a - b);

  /* minからmaxまでの連番の配列を作成 */
  const range = Array(max - min + 1) // 引数で渡された数の長さの配列を生成する
    .fill(0) // 配列を0で埋める
    .map((_, i) => i + min); // 第1引数は現在処理中の要素だが,「_」とすることで,その要素を使用しないことを明示.「i」は現在処理中の要素の配列内における添字
  
  /* 最大公約数の計算関数(ユークリッドのアルゴリズム) */
  const gcd = (a, b) => (b === 0) ? a : gcd(b, a % b);

  /* 最小公倍数の計算関数 */
  const lcm = (a, b) => a * b / gcd(a, b);
  
  /* 全ての数の最小公倍数を求める */
  return range.reduce((multiple, curr) => lcm(multiple, curr));
}

smallestCommons([1, 5]);

参考

https://www.freecodecamp.org/japanese/learn/javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/smallest-common-multiple

https://en.wikipedia.org/wiki/Greatest_common_divisor#Euclid's_algorithm:~:text=is generally preferred.-,Euclidean algorithm,-[edit]