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

【C++】大きな整数のデジタルルート(繰り返し桁合計)を求めるプログラム

はじめに

このチュートリアルでは、C++を使って与えられた大きな整数の「デジタルルート(デジタル根)」を求める方法を解説します。

デジタルルートとは、ある数の各桁の合計を計算し、その結果が1桁になるまで同じ操作を繰り返して得られる値のことです。例えば「12345」の場合、まず 1+2+3+4+5=15 となり、さらに 1+5=6 となるため、デジタルルートは 6 になります。

ここでは、int 型では表現できないような非常に大きな整数にも対応できるよう、数値を文字列形式で受け取ることを想定します。

アルゴリズムの手順

  • 文字列形式で整数を初期化します。
  • 文字列を先頭から順に走査し、各桁の数字を合計変数に加算します。
  • 合計が 0 の場合は、答えとして 0 を返します。
  • 合計が 9 で割り切れる場合は、答えは 9 になります。
  • それ以外の場合、答えは合計を 9 で割った余り(合計 % 9)です。

なぜ 9 での剰余だけでよいのでしょうか? 実は「任意の整数とその桁和は、9 を法として合同である」という数学的な性質があります。この性質のおかげで、桁和を実際に 1 桁になるまで何度も繰り返す必要はなく、一度の桁和計算と 9 の剰余演算だけでデジタルルートを求められるのです。

サンプルコード

#include<bits/stdc++.h>
using namespace std;
int digitalRoot(string n) {
    int digitsSum = 0;
    for (int i = 0; i < n.length(); i++) {
        digitsSum += n[i] - '0';
    }
    if (digitsSum == 0) {
        return 0;
    }
    return digitsSum % 9 == 0 ? 9 : digitsSum % 9;
}
int main() {
    string n = "12345";
    cout << digitalRoot(n) << endl;
    return 0;
}

実行結果

上記のコードを実行すると、以下の出力が得られます。

6

まとめ

このチュートリアルでは、文字列形式で与えられた大きな整数のデジタルルートを、9 の剰余に関する性質を利用して効率的に求める方法を学びました。この手法なら、どれほど桁数が多くても O(桁数) の計算量で処理できます。コードや解説についてご不明な点がある場合は、コメント欄でお気軽にお尋ねください。

  1. 【C++】部分木がBSTでもある二分木における最大部分木合計の求め方

    問題概要 この問題では、二分木 BT が与えられ、「その部分木自身も二分探索木(BST)である」という条件を満たす部分木の中から、ノード値の合計が最大となるものを見つけるプログラムを作成します。 二分木(Binary Tree)とは 二分木とは、各ノードが最大2つの子ノードを持つことができる特殊な木構造です。 二分探索木(BST)とは 二分探索木とは、すべてのノードが以下の性質を満たす木のことです。 左部分木のキー値は、親(ルート)ノードのキー値より小さい。 右部分木のキー値は、親(ルート)ノードのキー値以上である。 入出力例 入力: 出力: 32 説明:この木には BST として成立し

  2. C++で二分木の最も深い葉ノードの値の合計を求める方法

    はじめに二分木(バイナリツリー)が与えられたとき、その中で最も深い位置にある葉ノード(deepest leaves)の値の合計を求めることを考えます。例えば、次のような二分木があるとします。この場合、最も深い葉ノードは 7 と 4 であり、出力は 11 になります。解法のアプローチこの問題は、深さ優先探索(DFS)を用いて各レベルごとのノードの値の合計を記録し、最後に最大深度に対応する合計を取得することで解けます。具体的には、以下の手順に従います。レベルごとの合計を保持するマップ m と、最大深度を記録する変数 maxDepth を定義するノードとレベルを受け取る再帰メソッド solve()