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

JavaScriptで最小公倍数(LCM)を求める方法|1〜nの全自然数で割り切れる最小の数

本記事では、数値を1つ引数として受け取り、1からnまでのすべての自然数で割り切れる最小の数を見つけるJavaScript関数の作成方法を解説します。この「最小の数」こそが、数学でいうところの最小公倍数(LCM)です。

問題の例

例えば、n = 4 の場合、出力は 12 になります。
これは、12が「1・2・3・4」のすべての数で余りなく割り切れる、最も小さい数だからです。

サンプルコード(総当たり方式)

まずは、候補となる数を1つずつ検証していくシンプルな実装から見ていきましょう。

const smallestMultiple = num => {
    let res = 0;
    let i = 1;
    let found = false;
    while (found === false) {
        res += num;
        while (res % i === 0 && i <= num) {
            if (i === num) {
                found = true;
            }
            i++;
        }
        i = 1;
    }
    return res;
};
console.log(smallestMultiple(2));
console.log(smallestMultiple(4));
console.log(smallestMultiple(12));
console.log(smallestMultiple(15));

実行結果

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

2
12
27720
360360

コードの仕組み

この関数は単純なアプローチながら、いくつかの工夫が施されています。

  • numずつ加算: 変数resに引数numを繰り返し足していくことで、必ずnumの倍数だけを候補としてチェックできます。1ずつ増やす場合に比べ、無駄な試行を大幅に削減できます。
  • 割り切れるかの検証: 内側のwhileループで、現在のresが1からnumまでの各整数で余りなく割り切れるかを順番に確認します。
  • 終了条件: iがnumに達し、かつresがそれで割り切れた時点でフラグfoundをtrueにし、その値を結果として返します。

より効率的な方法:GCD(最大公約数)を活用する

上記の方法は分かりやすい反面、nが大きくなると処理時間が急激に伸びてしまいます。そこでおすすめしたいのが、次の公式を使ったアプローチです。

最小公倍数(a, b) = a × b ÷ 最大公約数(a, b)

ユークリッドの互除法で最大公約数(GCD)を求め、1からnまで順番に最小公倍数を畳み込んでいくことで、非常に高速に答えを得られます。

// ユークリッドの互除法による最大公約数
const gcd = (a, b) => (b === 0 ? a : gcd(b, a % b));

// 1からnまでの最小公倍数を求める
const lcmOfRange = n => {
    let result = 1;
    for (let i = 2; i <= n; i++) {
        result = (result * i) / gcd(result, i);
    }
    return result;
};
console.log(lcmOfRange(4));   // 12
console.log(lcmOfRange(10));  // 2520
console.log(lcmOfRange(15));  // 360360

この手法なら、nが数百規模になっても一瞬で計算できます。「1から20までの整数すべてで割り切れる最小の数」を問う有名なプログラミング課題(Project Euler Problem 5)も、この方法なら簡単に解くことができます。実務や競技プログラミングでは、こちらのGCDベースの実装を選ぶのが賢明でしょう。

  1. JavaScriptで配列に存在しない最小の正の整数を見つける方法

    JavaScriptでは、整数の配列を第一引数(唯一の引数)として受け取る関数を作成する必要があります。この関数の役割は、配列に存在しない最小の正の整数を見つけて返すことです。問題の例たとえば、入力配列が次のような場合を考えてみましょう。const arr = [4, 2, -1, 0, 3, 9, 1, -5];このとき、期待される出力は次のとおりです。const output = 5;理由は簡単です。1、2、3、4はすでに配列内に存在していますが、5は配列に含まれていないため、存在しない最小の正の整数となります。なお、負の数(-1、-5)や0は正の整数ではないため、答えの候補からは除外され

  2. JavaScriptで「良い基数(Good Base)」の最小値を求めるアルゴリズム

    良い基数(Good Base)とは= 2)のことを「良い基数(Good Base)」と呼びます。例えば、13 を基数 3 で表すと 111 となるため、3 は num = 13 における良い基数です。問題の概要数値を表す文字列 str を唯一の引数として受け取り、str の良い基数となる最小の数値を文字列形式で返す JavaScript 関数を作成する必要があります。例えば、関数への入力が以下の場合:const str = "4681";出力は次のようになります。const output = "8";出力の説明これは、4681 を基数 8 で表すと 11