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

C++で数値を繰り返し連結して形成した数の桁の再帰的合計を求める方法


整数「number」と「repeat」の2つが入力として与えられます。この問題の目的は、入力された数値を「repeat」回繰り返し連結して形成した新しい数値に対して桁の合計を計算し、その結果が1桁になるまで同じ操作を繰り返すことです。

例えば、number=123、repeat=2 の場合、123を2回連結した「123123」の桁の合計は 1+2+3+1+2+3=12 となります。12はまだ2桁の数値なので、さらに桁の合計を計算すると 1+2=3 となります。3は1桁の数値であるため、最終的な出力は 3 になります。

入出力シナリオの例

入力 − number=32, repeat=3

出力 − 繰り返し連結によって形成された数値の桁の再帰的合計:6

説明 − 323232 の桁の合計は 3+2+3+2+3+2=15 であり、さらに 15 の桁の合計は 1+5=6 です。6 は1桁の数値なので、出力は 6 となります。

入力 − number=81, repeat=4

出力 − 繰り返し連結によって形成された数値の桁の再帰的合計:9

説明 − 81818181 の桁の合計は 1+8+1+8+1+8+1+8=36 であり、さらに 36 の桁の合計は 3+6=9 です。9 は1桁の数値なので、出力は 9 となります。

プログラムで使用するアプローチ

  • 整数型の変数 number と repeat を宣言し、その値を関数 Recursive_Sum(number, repeat) に渡します。

  • 関数 Recursive_Sum(int number, int repeat) の内部では以下の処理を行います。

    • 整数型変数 total を宣言し、repeat * sum(number) の結果を設定します。

    • 関数 sum(total) を呼び出し、その結果を返します。

  • 関数 sum(int number) の内部では以下の処理を行います。

    • number が 0 の場合は 0 を返します。

    • number % 9 が 0 の場合は 9 を返します。

    • それ以外の場合は number % 9 を返します。

  • 結果を出力します。

このアルゴリズムの背景には「数字根(デジタルルート)」の性質があります。ある数の桁の合計を繰り返し求めて1桁にまで減らした結果は、その数を9で割った余りと密接な関係があります。具体的には、元の数が0でなければ、9の倍数の場合は9、それ以外の場合は9で割った余りが最終的な1桁の結果となります。

また、「number を repeat 回連結してできた数」の各桁の合計は「number の各桁の合計 × repeat」と等しくなるため、実際に巨大な数値や文字列を生成する必要がなく、非常に効率的に計算できるのがポイントです。

コード例

#include <bits/stdc++.h>
using namespace std;
int sum(int number){
    if(number == 0){
        return 0;
    }
    if(number % 9 == 0){
        return 9;
    }
    else{
        return number % 9;
    }
}
int Recursive_Sum(int number, int repeat){
    int total = repeat * sum(number);
    return sum(total);
}
int main(){
    int number = 12;
    int repeat = 4;
    cout<<"Recursive sum of digits of a number formed by repeated appends is: "<<Recursive_Sum(number, repeat);
    return 0;
}

出力

上記のコードを実行すると、以下の出力が生成されます。

Recursive sum of digits of a number formed by repeated appends is: 3

この例では、sum(12)=3(12 % 9 = 3)、total = 4 × 3 = 12、sum(12) = 3 となり、最終結果として 3 が出力されます。連結後の数値 12121212 を実際に扱わずに済むため、repeat が非常に大きい場合でも高速に動作します。

  1. 【C++】アリコット数列の求め方と実装例をわかりやすく解説

    アリコット数列とは アリコット数列(Aliquot Sequence)は、特殊な性質をもった数列です。数列はある整数から始まり、次の項は直前の項の真の約数(その数自身を除く約数)の総和として定義されます。 具体的な例で確認してみましょう。 入力 : 8 出力 : 8 7 1 0 解説 : 8 の真の約数は 4, 2, 1。その和は 7 7 の真の約数は 1。その和は 1 1 の真の約数は存在しないため、その和は 0 完全数・友愛数・社交数との関係 アリコット数列は、以下の3種類の特別な数と深い関わりがあります。 完全数:数列の長さが1(自分自身に戻る)となる数。例:6

  2. C++で数値の各桁の合計を計算するプログラム

    ここでは、C++言語を使用して入力された整数の各桁の合計を計算する方法を紹介します。剰余演算子と整数除算を組み合わせたシンプルなアルゴリズムで実装できます。 プログラム例 #include<iostream> using namespace std; int main() {    int x, s = 0;    cout << Enter the number : ;    cin >> x;    while (x != 0) {