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

【JavaScript】数値の各桁を繰り返し加算して1桁に収束させる2つの方法

本記事では、数値を受け取り、その各桁の数字を繰り返し合計していき、最終的に1桁の数値へと収束させるJavaScript関数の実装方法を解説します。

たとえば「123456」という数値の場合、「1 + 2 + 3 + 4 + 5 + 6 = 21」となり、さらに「2 + 1 = 3」で1桁になります。このように桁をまたいで合計を繰り返す処理は、チェックデジットの計算や数値の検証処理などでも使われる有名なテクニックです(デジタルルートと呼ばれます)。

この問題は、以下の2つのアプローチで解決できます。

方法1:ループを使用する

まず紹介するのは、whileループを使って各桁の数字を繰り返し足し合わせていく方法です。内側のループで各桁を合計し、結果がまだ2桁以上であれば外側のループが再度処理を行います。ロジックが直感的で理解しやすいのが特徴です。

コード例

const num = 123456;
const addDigits = (num = 1) => {
    let sum = num;
    while(sum % 10 !== sum){
        let sum1 = 0;
        while(sum > 0){
            sum1 += sum % 10;
            sum = Math.floor(sum / 10);
        }
        sum = sum1;
    };
    return sum;
};
console.log(addDigits(num));

処理の流れを簡単に整理すると、次のようになります。

  • 「sum % 10 !== sum」は、sumがまだ2桁以上かどうかを判定する条件です。
  • 内側のwhileループでは、「% 10」で末尾の桁を取り出して加算し、「Math.floor(sum / 10)」で桁を1つずらします。
  • 合計値が1桁になった時点で、その値を返します。

方法2:定数時間(O(1))で求める方法

続いての方法は、数学の合同式(Congruence Formula)を利用したものです。デジタルルートには「結果が9の倍数なら9、それ以外なら『数値を9で割った余り』と一致する」という美しい性質があります。これを活用すれば、ループ処理を一切使わずに、たった1回の計算で答えを導き出せます。大規模な数値を扱う場合でもパフォーマンスが落ちない、非常に効率的な手法です。仕組みをより深く理解したい方は、「デジタルルート」「合同式」について調べてみることをおすすめします。

コード例

const num = 123456;
const addDigits = (num = 1) => {
    let predicate = (num - 1) % 9;
    return ++predicate;
};
console.log(addDigits(num));

ここでは「(num - 1) % 9」で余りを求め、そこに1を加えることで、numが9の倍数である場合にも正しく「9」を返せるようにしています。

出力結果

どちらの方法を実行しても、コンソールには同じ結果が出力されます。

3

  1. JavaScriptのプロトタイプにメソッドを追加する方法

    JavaScriptのプロトタイプにメソッドを追加する方法JavaScriptでは、コンストラクタ関数のprototypeプロパティにメソッドを追加することで、そのコンストラクタから生成されたすべてのインスタンスが同じメソッドを共有できるようになります。各インスタンスに個別にメソッドを定義する必要がなくなるため、メモリの使用量を抑えられ、コードの保守性も向上します。以下は、JavaScriptのプロトタイプにメソッドを追加するコード例です。コード例<!DOCTYPE html> <html lang="ja"> <head> <me

  2. JavaScriptで数値の各桁の数字を一つずつ分割表示する方法

    はじめに この記事では、ユーザーが入力した数値を検証し、有効な数値であればその各桁の数字を画面に一つずつ表示するJavaScriptプログラムの作り方を解説します。 動作イメージ ページ上のボタンをクリックすると入力ダイアログが開き、そこに数値を入力してOKを押すと、入力された数値の各桁が一行ずつ画面に出力される仕組みです。 例えば、入力が次のような場合—— 43354 画面には次のように表示されます。 4 3 3 5 4 完成コード HTML <!DOCTYPE html> <html>   <head>   &n