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

JavaScriptで配列内のすべての数値を割り切れる最小の共通約数を見つける方法

はじめに

本記事では、数値の配列を受け取り、その配列内のすべての数値を余りなく(ちょうど)割り切れる数を返すJavaScript関数の作成方法を解説します。

このような「共通の約数」を見つける処理は、配列操作メソッドの使い方を学ぶうえでとても良い題材です。ここでは、各数値の約数を個別に求め、それらの積集合を取ることで、すべての要素に共通する約数を導き出します。

実装コード

以下が実際のコードです。

const arr = [4, 6, 34, 76, 78, 44, 34, 26, 88, 76, 42];

// 各数値の約数(1と自身を除く)を配列で返す関数
const dividesAll = el => {
    const result = [];
    let num;
    for (num = Math.floor(el / 2); num > 1; num--){
        if (el % num === 0) {
            result.push(num);
        }
    };
    return result;
};

// 配列全体から共通する約数のみを抽出する関数
const dividesArray = arr => {
    return arr.map(dividesAll).reduce((acc, val) => {
        return acc.filter(el => val.includes(el));
    });
};

console.log(dividesArray(arr));

コードの解説

dividesAll 関数

引数として受け取った数値 el の半分(Math.floor(el / 2))から2まで順にループし、el % num === 0 が成立する、つまり余りが出ない数(約数)result 配列へ追加していきます。1とその数自身は対象外です。

dividesArray 関数

map() によって配列内の各数値に dividesAll を適用し、それぞれの約数リストを取得します。続いて reduce()filter() を組み合わせ、隣り合う約数リスト同士の共通要素だけを段階的に残していく処理を行います。これにより、最終的には配列全体のすべての数値を割り切れる約数のみが残ります。

実行結果

上記のコードを実行すると、コンソールには次のように出力されます。

[ 2 ]

この結果から、サンプル配列内のすべての数値を余りなく割り切れる数は 2 のみであることがわかります。

まとめ

このアプローチは、各数値の約数を求めて積集合を計算するシンプルな方法です。ただし、配列の要素数や値が大きくなると計算量が増加するため、パフォーマンスが重視される場面では、ユークリッドの互除法による最大公約数(GCD)の計算もあわせて検討するとよいでしょう。

  1. JavaScriptでスペース区切りの数値文字列から最大値と最小値を抽出する方法

    問題 今回実装するのは、スペースで区切られた複数の数値を含む文字列を引数として受け取るJavaScript関数です。関数は、文字列の中から最大の数値と最小の数値だけを抜き出し、それらをスペースで区切った1つの文字列として返す必要があります。 入力例: const str = 5 57 23 23 7 2 78 6; 出力例: const output = 78 2; これは、配列内の最大値が 78、最小値が 2 であるためです。 解決策:reduce() を使った実装 以下のコードでは、split() で文字列を配列に変換し、reduce() メソッドを使って1回の走査で最大値と最小値を同時

  2. 【JavaScript入門】配列内で最初の非連続な数値を見つける方法

    はじめに本記事では、JavaScriptを使って「数値の配列の中から、直前の要素と連続していない最初の数値」を見つける方法を解説します。アルゴリズムの練習やコーディング面接の対策としても役立つ基本的な問題です。 問題の定義数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、直前の要素に対して +1 となっていない(連続していない)最初の要素を返さなければなりません。 言い換えると、隣り合う要素同士の差が1以外になる箇所が現れたとき、その箇所の後ろ側の要素を返すという処理です。なお、そのような要素が必ず配列内に1つ以上存在するものとします。 サンプルコード以下は、実