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

JavaScript:配列の全要素の倍数となる最小のn桁の数を見つける方法

JavaScriptでは、第一引数に数値(桁数n)、第二引数に数値の配列を受け取り、その配列内のすべての要素の倍数となる最小のn桁の数を返す関数を作成する方法を考えてみましょう。

もし条件を満たすn桁の数が存在しない場合は、すべての要素の倍数となる最小の数(最小公倍数)を返します。

問題の概要

例として、次のような配列が与えられたとします。

const arr = [12, 4, 5, 10, 9]

この場合、n = 2 の場合も n = 3 の場合も、出力は 180 となります。

これは、180 が配列の全要素(12, 4, 5, 10, 9)で割り切れる最小の数だからです。2桁の範囲には条件を満たす数が存在しないため、探索は3桁以降へと続けられ、結果的に 180 に到達します。

実装例

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

const arr = [12, 4, 5, 10, 9]
const num1 = 2;
const num2 = 3;
const allDivides = (arr, num) => arr.every(el => num % el === 0);
const smallestMultiple = (arr, num) => {
    let smallestN = Math.pow(10, (num - 1));
    while(!allDivides(arr, smallestN)){
        smallestN++;
    };
    return smallestN;
};
console.log(smallestMultiple(arr, num1));
console.log(smallestMultiple(arr, num2));

実行結果

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

180
180

コードの解説

allDivides 関数

Array.prototype.every() メソッドを使い、配列のすべての要素が対象の数を割り切れるかどうかを判定します。すべての要素に対して num % el === 0 が成立する場合にのみ true を返します。

smallestMultiple 関数

まず Math.pow(10, num - 1) によって最小のn桁の数を求めます。例えば n = 2 なら 10 からスタートし、条件を満たさない間は候補の数を1ずつ増やしながら繰り返しチェックを行います。全要素の倍数となる数が見つかった時点で、その値を返します。

最小公倍数(LCM)による効率化

上記の方法は線形探索のため、n が大きい場合や配列要素の最小公倍数が大きい場合には処理に時間がかかる可能性があります。そこで、最小公倍数をあらかじめ計算しておけば、答えを直接かつ高速に導き出せます。

const gcd = (a, b) => (b === 0 ? a : gcd(b, a % b));
const lcmOfArray = (arr) => arr.reduce((acc, el) => acc * el / gcd(acc, el));
const smallestMultipleFast = (arr, num) => {
  const l = lcmOfArray(arr);
  const min = Math.pow(10, num - 1);
  return Math.ceil(min / l) * l;
};
console.log(smallestMultipleFast(arr, num1)); // 180
console.log(smallestMultipleFast(arr, num2)); // 180

ユークリッドの互除法で最大公約数(GCD)を求め、reduce() と組み合わせることで配列全体の最小公倍数を算出できます。あとは「n桁の最小値以上となる最小の公倍数」を計算すれば、同じ答えを瞬時に得ることができます。

  1. C++で指定された数値の最小の桁を見つけるプログラムの書き方

    負でない整数が与えられたとき、その数値を構成する各桁の中から最小の数字を見つけるのが本記事の課題です。 例 入力: N = 154870 出力: 0 説明: 入力された数値「154870」には 1・5・4・8・7・0 の6つの桁が含まれており、その中で最も小さいのは「0」です。 解き方のアプローチ この問題を解く最もシンプルな方法は、剰余演算(% 演算子)を使って末尾の桁を1つずつ取り出しながら数値を走査し、取り出した桁が現在の最小値より小さければ最小値を更新していくというものです。 整数 n を入力として受け取ります。 関数 smallest_digit(int n) は引数 n を受け取

  2. Pythonでxより大きい最小の整数を求める方法|math.ceil()関数の使い方を解説

    Pythonで「xより大きい最小の数」を求めるには? Pythonでは、組み込みモジュール math に含まれる ceil() 関数を使うことで、指定した数値以上の最小の整数(天井値)を簡単に求めることができます。 ceil() は「切り上げ」を行う関数で、引数に渡した数値より大きい、または等しい最小の整数を返します。小数点以下の値に関係なく、常に上方向へ丸められるのが特徴です。 math.ceil() の基本的な使い方 まずは具体的なコード例を見てみましょう。 >>> x = 6.67 >>> import math >>> math.