JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで複数の数値の最小公倍数(LCM)を計算する方法

本記事では、任意の長さの数値の配列を受け取り、それらすべての最小公倍数(LCM:Least Common Multiple)を返すJavaScript関数の実装方法を解説します。
この問題は、以下の3つのステップに分けて段階的に解決していきます。

アプローチの概要

ステップ1:GCD(最大公約数)を求めるヘルパー関数を作成する

まず、2つの整数の最大公約数(GCD:Greatest Common Divisor)を計算するヘルパー関数を用意します。ここでは、再帰呼び出しで簡潔に記述できる古典的なアルゴリズム「ユークリッドの互除法」を採用します。これは「2数の最大公約数は、大きい方を小さい方で割った余りと、小さい方の数の最大公約数に等しい」という性質を利用した手法です。

ステップ2:LCM(最小公倍数)を求めるヘルパー関数を作成する

続いて、ステップ1で作成したGCD関数を利用して、2つの整数の最小公倍数を計算する別のヘルパー関数を作成します。2つの正の整数 a と b の間には「LCM × GCD = a × b」という関係が成り立つため、LCMは「a × b ÷ GCD(a, b)」という式で求められます。

ステップ3:配列全体のLCMを計算する本体関数を作成する

最後に、ステップ2のLCM関数を使い、配列を先頭から順にループ処理しながら配列全体のLCMを求める関数を作成します。ポイントは、「これまでに求めた累積LCM」と「次の要素」のLCMを順番に計算していくことで、要素の個数に関係なく対応できる点です。

コード例

実際のコードは以下のとおりです。

const calculateLCM = (...arr) => {
    const gcd2 = (a, b) => {
        // 2つの整数の最大公約数(GCD)を再帰的に計算
        if (!b) return b === 0 ? a : NaN;
        return gcd2(b, a % b);
    };
    const lcm2 = (a, b) => {
        // 2つの整数の最小公倍数(LCM)を計算
        return a * b / gcd2(a, b);
    };
    // 整数のリスト全体の最小公倍数(LCM)を計算
    let n = 1;
    for (let i = 0; i < arr.length; ++i) {
        n = lcm2(arr[i], n);
    }
    return n;
};
console.log(calculateLCM(12, 18, 7, 15, 20, 24, 28));

出力結果

コンソールには以下のように出力されます。

2520

コードのポイント解説

  • GCDの再帰計算:gcd2 関数は、第2引数 b が 0 になった時点で a を最大公約数として返します。それ以外の場合は、b と「a を b で割った余り」を引数に自分自身を再帰呼び出しすることで、ユークリッドの互除法を実現しています。
  • LCMの計算:lcm2 関数は「a × b ÷ GCD(a, b)」という数学的関係をそのままコード化したものです。
  • 可変長引数への対応:calculateLCM 関数はレスト構文(...arr)を使用しているため、引数の個数を気にせず任意の数の値を渡せます。
  • 初期値の扱い:累積変数 n の初期値を 1 に設定しているため、最初の要素とのLCMから安全に計算を開始できます。

このように、GCD → LCM → 配列処理という順序で機能を分割して実装すると、読みやすく保守性の高いコードになります。同じ考え方は、複数の分数の通分や周期を持つイベントの同期計算など、さまざまな場面で応用できます。

  1. 【初心者向け】JavaScriptでボタンクリック時に数値を加算するSum関数の作り方

    はじめに 本記事では、ボタンをクリックするたびに指定した値を加算していき、結果を画面に表示するシンプルなJavaScriptの「Sum関数」の実装方法を解説します。onclickイベントとparseInt()を組み合わせることで、わずか数行のコードで動的な加算処理を実現できます。 ボタンの準備 まず、以下のようなHTMLボタンを用意します。 <button type=button onclick=addTheValue(10)>Sum</button> このボタンがクリックされると、引数として10を渡して関数 addTheValue(10) が呼び出されます。つま

  2. JavaScriptで数値配列の分散を計算する方法

    問題昇順にソートされた数値の配列を受け取り、その分散(Variance)を計算するJavaScript関数を作成する必要があります。分散とは、一連の数値が平均値からどれだけばらついているかを表す統計量で、まず平均値を求め、その平均との差の二乗和をデータ数で割ることで計算できます。計算式まず、平均値(M)は次のように定義されます。$Mean (M) = ( \sum_{i=0}^{n-1} arr[i])$ / n続いて、分散(V)は各要素と平均値の差を二乗し、それらを合計してデータ数で割った値になります。Variance (V) = $(\sum_{i=0}^{n-1} (arr[i] - M