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

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 が非常に大きい場合は実行時間に注意が必要ですが、一般的な入力サイズであれば十分に高速に動作します。

  1. 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

  2. PythonでAの倍数かつ桁の合計がBと等しい最小の正の整数を求める方法

    問題の概要 2つの整数 A と B が与えられたとき、「A で割り切れ、かつ各桁の数字の合計が B と等しい」という条件を満たす最小の正の整数 M を求めます。そのような数が存在しない場合は -1 を返します。 例えば、入力が A = 50、B = 2 の場合、出力は 200 となります。200 は 50 で割り切れ、桁の合計も 2 + 0 + 0 = 2 となり、両方の条件を満たす最小の数だからです。 解法のアプローチ:幅優先探索(BFS) この問題は幅優先探索(BFS)を用いることで効率的に解けます。BFS は桁数の少ない数から順に探索を進めるため、最初に見つかった解が必ず最小値になりま