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

【JavaScript】数値を文字列変換なしで再帰的に合計し、1桁になるまで繰り返す方法

本記事では、数値の各桁を再帰的に合計し、結果が1桁になるまでその処理を繰り返すJavaScript関数の実装方法を解説します。ポイントは、数値を文字列や他のデータ型へ変換せず、純粋な数値演算だけで処理を完結させる点です。

実装の考え方

各桁の合計を求めるには、「10で割った余り(% 10)」で最下位の桁を取り出し、「10で割って小数点以下を切り捨てた値(Math.floor(num / 10))」で残りの桁を取得します。この操作を再帰的に繰り返すことで、数値を文字列化することなく各桁の和を計算できます。

さらに、合計した結果が9より大きい場合(つまり2桁以上の場合)は、再度同じ処理を適用します。これを1桁になるまで繰り返すのが sumRepeatedly 関数の役割です。なお、このようにして得られる最終的な1桁の値は、数学では「デジタルルート(digital root)」として知られています。

コード例

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

const num = 546767643;
const sumDigit = (num, sum = 0) => {
    if(num){
        return sumDigit(Math.floor(num / 10), sum + (num % 10));
    }
    return sum;
};
const sumRepeatedly = num => {
    while(num > 9){
        num = sumDigit(num);
    };
    return num;
};
console.log(sumRepeatedly(num));

コードの解説

sumDigit 関数は、引数 num と累積用の sum を受け取ります。num が 0 でない限り、Math.floor(num / 10) で桁を一つ減らしながら、sum + (num % 10) で取り出した桁を合計に加えて自身を再帰呼び出しします。num が 0 になった時点で、それまでの合計値 sum を返します。

sumRepeatedly 関数は while ループを使い、num が 9 以下(1桁)になるまで sumDigit を繰り返し適用します。

出力

コンソールには以下の出力が表示されます −

3

計算の流れ

例として 546767643 を見てみましょう。

まず 5+4+6+7+6+7+6+4+3 = 48、次に 4+8 = 12、さらに 1+2 = 3 となり、最終的に 3 という1桁の数値が得られます。このように、再帰と単純な剰余演算・除算を組み合わせるだけで、文字列変換に頼らない効率的な実装が可能です。

  1. 【C++】数値の桁の合計が1桁になるまで計算するプログラムの作成方法

    はじめに本記事では、数値の各桁の合計を計算し、その結果が1桁になるまで処理を繰り返すC++プログラムについて解説します。例として、数値14520を考えてみましょう。まず各桁を足すと、1 + 4 + 5 + 2 + 0 = 12となります。しかし12はまだ2桁の数値なので、さらにその桁同士を足し合わせます。すると、1 + 2 = 3となります。3は1桁の数値であるため、これ以上桁の合計を計算することはできません。したがって、3が最終的な答えとなります。解法のアプローチ:デジタルルートの活用この問題を効率的に解くには、「9の倍数の各桁の合計は必ず9になる」という数学的な性質を利用します。9で割り切

  2. Pythonで各桁の合計を1桁になるまで繰り返し計算する方法【デジタルルート】

    正の整数 n が与えられたとき、そのすべての桁の数字を足し合わせて新しい数を作り、この操作を結果が10未満(1桁)になるまで繰り返すことを考えます。このようにして得られる「1桁に還元された数」はデジタルルート(数根)と呼ばれる有名な概念です。 例えば、入力が 9625 の場合、出力は 4 になります。計算の流れは以下のとおりです。 9 + 6 + 2 + 5 = 22 2 + 2 = 4 解法のアプローチ この問題は、再帰呼び出しを利用すると簡潔に解くことができます。具体的な手順は次のとおりです。 solve() メソッドを定義し、引数として n を受け取る n < 10 の場合、