JavaScriptで数値の桁を合計し、1桁になるまで繰り返す方法
この記事では、数値を唯一の引数として受け取り、その各桁を合計した結果が1桁の数字に収束するまで合計を繰り返すJavaScript関数の作成方法を解説します。
問題の概要
例えば、次のような数値が与えられたとします。
const num = 54564567;
この場合、関数は以下のように各桁を順番に合計していきます。
5+4+5+6+4+5+6+7 = 42 4+2 = 6
したがって、最終的な出力は 6 になります。
実装のアプローチ
まず、再帰処理を使って数値の各桁を合計するヘルパー関数 sumDigits を定義します。num % 10 で最下位の桁を取り出して合計に加算し、Math.floor(num / 10) で残りの桁に対して再帰的に同じ処理を繰り返します。
次に、合計結果が9以下(つまり1桁)になるまで sumDigits を繰り返し呼び出す関数 sumDestructively を while ループで定義します。
コード例
const num = 54564567;
// 各桁を合計する再帰関数
const sumDigits = (num, sum = 0) => {
if (num) {
return sumDigits(Math.floor(num / 10), sum + (num % 10));
}
return sum;
}
// 合計が1桁になるまで繰り返し計算する関数
const sumDestructively = (num) => {
let sum = num;
while (sum > 9) {
sum = sumDigits(sum);
}
return sum;
}
console.log(sumDestructively(num));
出力結果
コンソールには次のように表示されます。
6
補足:デジタルルートという考え方
このように「1桁になるまで桁を合計する」操作は、数学ではデジタルルート(digital root)と呼ばれます。実は、正の整数 n のデジタルルートは次の式で O(1) の計算量で求めることも可能です。
const digitalRoot = (n) => (n === 0 ? 0 : 1 + ((n - 1) % 9)); console.log(digitalRoot(54564567)); // 6
大きな数値や大量のデータを扱う場合は、こちらの数式による方法の方が効率的です。
-
JavaScriptで数値の各桁の数字を一つずつ分割表示する方法
はじめに この記事では、ユーザーが入力した数値を検証し、有効な数値であればその各桁の数字を画面に一つずつ表示するJavaScriptプログラムの作り方を解説します。 動作イメージ ページ上のボタンをクリックすると入力ダイアログが開き、そこに数値を入力してOKを押すと、入力された数値の各桁が一行ずつ画面に出力される仕組みです。 例えば、入力が次のような場合—— 43354 画面には次のように表示されます。 4 3 3 5 4 完成コード HTML <!DOCTYPE html> <html> <head> &n
-
JavaScriptで長方形内に埋め込まれた正方形の周囲長の合計を求める方法
問題 下図のように、1つの長方形の中に正方形が5つ埋め込まれている状況を考えてみましょう。 このとき、それぞれの正方形の周囲長は次のようになります。 4 + 4 + 8 + 12 + 20 = 48 単位 一見すると複雑な計算が必要そうに思えますが、よく観察すると各正方形の一辺の長さがフィボナッチ数列(1, 1, 2, 3, 5, ...)に従っていることが分かります。つまり、n個の正方形が埋め込まれている場合、周囲長の合計は「最初のn項のフィボナッチ数の総和 × 4」で求められるのです。 そこで本記事では、数値 n を引数として受け取り、n個の正方形が埋め込まれた場合の周囲長の合計を返す