JavaScriptで配列内の最小値の桁和が偶数かどうかを判定する方法
本記事では、数値の配列を唯一の引数として受け取るJavaScript関数の実装方法を解説します。この関数は、まず配列の中から最小の数値を選び出し、その数値を構成するすべての桁の合計(桁和)を計算します。
そして、その桁和が偶数であれば true を、奇数であれば false を返すという仕様です。
動作の例
たとえば、次のような入力配列が与えられた場合を考えてみましょう。
const arr = [12, 657, 23, 56, 34, 678, 42];
この場合の出力は次のようになります。
const output = false;
理由はシンプルです。配列内の最小値は 12 であり、その桁和は 1 + 2 = 3。これは奇数であるため、関数は false を返します。
実装コード
この処理を実現するコードは以下のとおりです。
const arr = [12, 657, 23, 56, 34, 678, 42];
// 数値の各桁の合計を再帰的に計算する関数
const addDigits = (num = 1, sum = 0) => {
if(!num){
return sum;
};
return addDigits(Math.floor(num / 10), sum + (num % 10));
};
// 配列から最小値を取り出す関数
const findSmallest = (arr = []) => arr.reduce((acc, val) => Math.min(acc, val));
// 最小値の桁和が偶数かどうかを判定するメイン関数
const checkSmallestSum = (arr = []) => {
const smallest = findSmallest(arr);
const smallestSum = addDigits(smallest);
return smallestSum % 2 === 0;
};
console.log(checkSmallestSum(arr));コードの解説
それぞれの関数の役割を順番に見ていきましょう。
1. addDigits — 桁和を再帰的に計算
addDigits 関数は、数値を10で割った余り(num % 10)で一の位を取り出して合計に加え、Math.floor(num / 10) で桁を一つずらしながら再帰呼び出しを行います。数値が0になった時点で累積した合計値を返却します。
2. findSmallest — 最小値の抽出
findSmallest 関数は、配列の reduce() メソッドを使って要素を先頭から順に比較し、最も小さい値を返します。Math.min() を活用することで簡潔に記述できます。
3. checkSmallestSum — 判定ロジック
メインとなる checkSmallestSum 関数は、上記の2つの関数を組み合わせます。まず最小値を取得し、次にその桁和を計算し、最後に「桁和 % 2 === 0」で偶数かどうかを判定した結果を真偽値として返します。
実行結果
コンソールには以下のように出力されます。
false
なお、最小値の抽出は Math.min(...arr) のスプレッド構文を使っても同じ結果が得られます。用途や可読性の好みに応じて使い分けるとよいでしょう。
-
JavaScriptで数字列の中から最大の5桁の連続数字を見つける方法
問題少なくとも5桁以上の数字で構成される文字列を受け取るJavaScript関数を作成する必要があります。この関数は、与えられた数字列の中に含まれる「連続する5桁」の中で最も大きな数値を返さなければなりません。たとえば、入力が 123546544 の場合、取りうる5桁の組み合わせは「12354」「23546」「35465」「54654」「46544」となり、この中で最大のものは 54654 です。解決アプローチ考え方はシンプルです。文字列を先頭から1文字ずつずらしながら、5文字分を切り出す切り出したすべての5桁の部分文字列を配列に格納するMath.max() を使って最大値を求めるJavaSc
-
JavaScriptで数値の各桁を切り取って配列を作成する方法
問題今回は、数値を受け取り、その数値を先頭から各桁の位置で切り取った文字列を要素として持つ配列を返すJavaScript関数を作成します。例えば、入力が 246 の場合、出力は [2, 24, 246] のようになります。つまり、最初の1桁目だけ、次に2桁目まで、最後に数値全体というように、桁を増やしながら文字列を配列に格納していくイメージです。実装コード例以下は実際のコードです。const num = 246; const cutOffEach = (num = 1) => { const str = String(num); &nbs