C++で「x + 桁の合計 = n」を満たす数xを見つける方法
この記事では、ある整数 n が与えられたとき、「x + x の各桁の合計 = n」という条件を満たす数 x を求める問題を解説します。
例として、n = 21 の場合を考えてみましょう。このとき答えは x = 15 となります。なぜなら、15 の各桁の合計は 1 + 5 = 6 であり、15 + 6 = 21 となって、与えられた n と一致するからです。
解き方のアプローチ
この問題はシンプルな方法で解くことができます。1 から n まで順番に数を調べていき、それぞれの数について「その数自身 + 各桁の合計」が n と等しくなるかどうかを確認します。条件を満たす数が見つかった時点で処理を終了し、その値を返します。最後まで見つからなかった場合は -1 を返します。
C++での実装例
#include<iostream>
using namespace std;
// 各桁の合計を計算する関数
int getDigitSum(int n) {
int sum = 0;
while (n) {
sum += n % 10; // 最下位の桁を加算
n /= 10; // 桁を一つずらす
}
return sum;
}
// 条件を満たす数xを探す関数
int getNumber(int n) {
for (int i = 0; i <= n; i++)
if (i + getDigitSum(i) == n)
return i;
return -1; // 見つからない場合
}
int main() {
int n = 21;
cout << "The value of x is: " << getNumber(n);
}実行結果
The value of x is: 15
コードのポイント
getDigitSum 関数では、剰余演算(% 10)で最下位の桁を取り出し、10 で割ることで桁をずらしていくことで、全桁の合計を効率的に計算しています。
getNumber 関数では、0 から n まで線形探索を行い、条件「i + getDigitSum(i) == n」を満たす最初の数を返します。該当する数が存在しない場合は -1 を返す設計になっています。
このアルゴリズムの計算量は O(n × d) です(d は桁数)。n が非常に大きい場合は実行時間に注意が必要ですが、一般的な入力サイズであれば十分に高速に動作します。
-
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
-
PythonでAの倍数かつ桁の合計がBと等しい最小の正の整数を求める方法
問題の概要 2つの整数 A と B が与えられたとき、「A で割り切れ、かつ各桁の数字の合計が B と等しい」という条件を満たす最小の正の整数 M を求めます。そのような数が存在しない場合は -1 を返します。 例えば、入力が A = 50、B = 2 の場合、出力は 200 となります。200 は 50 で割り切れ、桁の合計も 2 + 0 + 0 = 2 となり、両方の条件を満たす最小の数だからです。 解法のアプローチ:幅優先探索(BFS) この問題は幅優先探索(BFS)を用いることで効率的に解けます。BFS は桁数の少ない数から順に探索を進めるため、最初に見つかった解が必ず最小値になりま