C++で「数値とその各桁の合計がNに等しい数X」を見つける方法
このチュートリアルでは、「ある数値Xとその各桁の数字の合計を足した値が、与えられた数Nと等しくなる」という条件を満たす数Xを見つける方法を解説します。
解法のアイデア
考え方は非常にシンプルです。与えられた数Nの前後それぞれ100以内の範囲にある数をすべてチェックします。
制約として N ≤ 1,000,000,000(10億)であり、各桁の数字の合計は最大でも100程度にしかなりません。そのため、答えとなる数Xがこの範囲の外側に存在することはありません。
アルゴリズムの手順
- 対象となる数値Nを初期化します。
- 0から100まで繰り返すループを作成します。
- n - i と n + i の値をそれぞれ取得します。
- それぞれの数値について各桁の合計を計算し、元の数値に加算します。
- 結果がNと一致した場合、その数値を出力します。
実装例
それでは、実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
int digitsSum(int n) {
int sum = 0;
while (n) {
sum += n % 10;
n /= 10;
}
return sum;
}
void findX(long int n) {
bool is_found = false;
for (int i = 0; i <= 100; i++) {
long int valueOnLeft = abs(n - i) + digitsSum(abs(n - i));
long int valueOnRight = n + i + digitsSum(n + i);
if (valueOnLeft == n) {
is_found = true;
cout << abs(n - i) << " ";
}
if (valueOnRight == n) {
is_found = true;
cout << (n + i) << " ";
}
}
if (!is_found) {
cout << "No numbers found";
}
cout << endl;
}
int main() {
int n = 89;
findX(n);
return 0;
}
実行結果
上記のプログラムを実行すると、以下の出力が得られます。
76
この例では、76 + 7 + 6 = 89 となり、条件を満たしていることが確認できます。
まとめ
本チュートリアルでは、各桁の数字との合計がNに等しい数Xを効率的に見つける方法を学びました。探索範囲を前後100に限定することで、高速に求解できる点が大きなポイントです。チュートリアルの内容について質問がある場合は、コメント欄でお気軽にお知らせください。
-
C++を使って「数x + xの桁の合計 = n」となる数xを求める方法
ここでは、ある数nが与えられたとき、「数xとその桁の合計を足した値がnと等しくなる」ようなxを求める問題を扱います。例えば、nが21の場合、答えはx = 15となります。15の桁の合計は1 + 5 = 6なので、15 + 6 = 21 = nとなり、条件を満たすからです。この問題を解くには、シンプルなアプローチが有効です。0からnまでの数を順番に調べていき、各数値について「その数 + 桁の合計」がnと一致するかどうかを確認します。一致する数が見つかった時点でその値を返し、最後まで見つからなければ-1を返します。サンプルコード#include<iostream> using name
-
C++で「x + 桁の合計 = n」を満たす数xを見つける方法
この記事では、ある整数 n が与えられたとき、「x + x の各桁の合計 = n」という条件を満たす数 x を求める問題を解説します。例として、n = 21 の場合を考えてみましょう。このとき答えは x = 15 となります。なぜなら、15 の各桁の合計は 1 + 5 = 6 であり、15 + 6 = 21 となって、与えられた n と一致するからです。解き方のアプローチこの問題はシンプルな方法で解くことができます。1 から n まで順番に数を調べていき、それぞれの数について「その数自身 + 各桁の合計」が n と等しくなるかどうかを確認します。条件を満たす数が見つかった時点で処理を終了し、そ