C++で数値の桁の合計を1桁になるまで繰り返し求める方法
このチュートリアルでは、与えられた整数の各桁の合計を計算し、その結果が1桁になるまで同じ処理を繰り返すプログラムをC++で作成します。このような演算は「デジタルルート(数字根)」と呼ばれることもあります。
まずは具体的な例を見てみましょう。
- 入力: 4543
- 出力: 7
計算の流れは次のとおりです。まず 4 + 5 + 4 + 3 = 16 となり、16はまだ2桁なのでさらに 1 + 6 = 7 を計算します。7は1桁なので、これが最終的な答えになります。
解き方の手順
- 対象となる数値を用意します。
- 合計を格納する変数を0で初期化します。
- 合計が9以下になるまで以下の処理を繰り返します。
- モジュロ演算子(%)を使って数値の各桁を取り出し、合計に加算します。
- 数値を10で割って次の桁へ進みます。
- 最終的な合計を出力します。
実装例:繰り返し計算による方法
それでは、実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
void findTheSingleDigit(int n) {
int sum = 0;
while (n > 0 || sum > 9) {
if (n == 0) {
n = sum;
sum = 0;
}
sum += n % 10;
n /= 10;
}
cout << sum << endl;
}
int main() {
int n = 4543;
findTheSingleDigit(n);
return 0;
}
出力
上記のプログラムを実行すると、次のような結果が得られます。
7
このコードでは、whileループの条件に「n > 0 || sum > 9」を指定することで、すべての桁を処理し終えた後も合計が2桁以上の場合には、合計の値を新たな入力として再び同じ計算を繰り返せるようにしています。
別の解法:9の剰余を利用した効率的な方法
実は、この問題にはもっとシンプルで高速な解法があります。デジタルルートには次のような数学的な性質があるためです。
- 数値が9で割り切れる場合、答えは9になります(ただし0は除く)。
- それ以外の場合、答えはn % 9と一致します。
この性質を利用すれば、ループ処理なしに一定時間(O(1))で答えを求められます。
#include <bits/stdc++.h>
using namespace std;
void findTheSingleDigit(int n) {
if (n == 0) {
cout << 0 << endl;
}
else if (n % 9 == 0) {
cout << 9 << endl;
}
else {
cout << n % 9 << endl;
}
}
int main() {
int n = 4543;
findTheSingleDigit(n);
return 0;
}
出力
上記のコードを実行すると、次の結果が出力されます。
7
4543を9で割った余りは7なので、繰り返し計算の結果と一致していることが確認できます。大きな数値を扱う場合やパフォーマンスが重視される場面では、こちらの方法が有利です。
まとめ
本記事では、C++で数値の桁の合計を1桁になるまで計算する2つの方法を紹介しました。1つ目はモジュロ演算子を使った素直な繰り返し計算、2つ目は9の剰余の性質を利用した効率的な手法です。どちらも結果は同じですが、計算量の観点では後者が優れています。チュートリアルについて質問がある場合は、コメント欄でお知らせください。
-
C++で数値の各桁の合計を計算するプログラム
ここでは、C++言語を使用して入力された整数の各桁の合計を計算する方法を紹介します。剰余演算子と整数除算を組み合わせたシンプルなアルゴリズムで実装できます。 プログラム例 #include<iostream> using namespace std; int main() { int x, s = 0; cout << Enter the number : ; cin >> x; while (x != 0) {
-
Pythonで各桁の合計を1桁になるまで繰り返し計算する方法【デジタルルート】
正の整数 n が与えられたとき、そのすべての桁の数字を足し合わせて新しい数を作り、この操作を結果が10未満(1桁)になるまで繰り返すことを考えます。このようにして得られる「1桁に還元された数」はデジタルルート(数根)と呼ばれる有名な概念です。 例えば、入力が 9625 の場合、出力は 4 になります。計算の流れは以下のとおりです。 9 + 6 + 2 + 5 = 22 2 + 2 = 4 解法のアプローチ この問題は、再帰呼び出しを利用すると簡潔に解くことができます。具体的な手順は次のとおりです。 solve() メソッドを定義し、引数として n を受け取る n < 10 の場合、