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

【C++】デジタルルート(繰り返し桁和)がNとなるM番目の数を求める方法

問題概要

この問題では、2つの正の整数 N と M が与えられます。求めるのは、「ある数の各桁の和を繰り返し計算して1桁になるまで処理した結果(デジタルルート)が N と等しくなる」ような数のうち、M番目の数です。

例えば、入力として N = 4、M = 6 が与えられた場合、出力は 49 となります。

その理由を見てみましょう。49 の各桁の和は 4 + 9 = 13、さらに 1 + 3 = 4 となり、最終的に 4 になります。デジタルルートが 4 となる数は 4, 13, 22, 31, 40, 49 … と公差 9 で続いていくため、6番目の数は 49 となるのです。

解法アプローチ

最も単純な解法は、すべての数を順番に調べ、デジタルルートが N と一致する数をカウントしていき、M個目に到達した時点でその数を返すというものです。

しかし、この問題にはより効率的な数式を使った解法が存在します。デジタルルートが N となる数は、N, N+9, N+18, … というように公差 9 の等差数列をなすため、M番目の数は次の式で一発的に求められます。

M番目の数 = (M − 1) × 9 + N

この式により、数を順に走査する必要がなくなり、O(1) の計算量で答えを得ることができます。

解法の実装プログラム

以下は、上記の式を使って問題を解く C++ プログラムの例です。

#include <bits/stdc++.h>
using namespace std;

int main() {

    int n = 4, m = 6;
    int mNumber = (m - 1) * 9 + n;
    cout<<m<<"-th number whose repeated sum of digits of a number is "<<n<<" is "<<mNumber;
    return 0;
}

出力

6-th number whose repeated sum of digits of a number is 4 is 49

このように、公式を活用することで繰り返し処理を行わずに、目的の M 番目の数を簡単かつ高速に求めることができます。

  1. C++で数の奇数の素因数の合計を効率的に求める方法

    この記事では、ある数の奇数の素因数すべての合計を、効率的に求める方法を解説します。例として n = 1092 という数を考えてみましょう。1092 を素因数分解すると 2 × 2 × 3 × 7 × 13 となり、このうち奇数の素因数は 3、7、13 です。したがって、奇数の素因数の合計は 3 + 7 + 13 = 23 となります。この問題を解くためには、以下のルールに従います。数が 2 で割り切れる間は、その因数を無視して、数を 2 で繰り返し割ります。この時点で数は必ず奇数になっています。3 から数の平方根までの範囲で、現在の値 i で割り切れる場合は、その因数を合計に加算し、数を i

  2. 【C++】数値の桁の合計が1桁になるまで計算するプログラムの作成方法

    はじめに本記事では、数値の各桁の合計を計算し、その結果が1桁になるまで処理を繰り返すC++プログラムについて解説します。例として、数値14520を考えてみましょう。まず各桁を足すと、1 + 4 + 5 + 2 + 0 = 12となります。しかし12はまだ2桁の数値なので、さらにその桁同士を足し合わせます。すると、1 + 2 = 3となります。3は1桁の数値であるため、これ以上桁の合計を計算することはできません。したがって、3が最終的な答えとなります。解法のアプローチ:デジタルルートの活用この問題を効率的に解くには、「9の倍数の各桁の合計は必ず9になる」という数学的な性質を利用します。9で割り切