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

C++でマジックナンバー(桁の再帰和が1になる数)かどうかを判定する方法

本記事では、ある整数が「マジックナンバー」であるかどうかを判定するC++プログラムを紹介します。マジックナンバーとは、各桁の数字を再帰的に合計していき、最終的に1になる数のことです。

マジックナンバーとは?

例として、50311という数を見てみましょう。

50311 → 5 + 0 + 3 + 1 + 1 = 10
10 → 1 + 0 = 1

このように、桁の合計が最終的に1になれば、その数はマジックナンバーと呼ばれます。判定するには、数が1桁になるまで各桁の合計を繰り返し求める必要があります。

C++での実装例

#include <iostream>
using namespace std;

int isMagicNumber(int n) {
    int digit_sum = 0;
    while (n > 0 || digit_sum > 9) {
        if (n == 0) {
            n = digit_sum;   // 桁の合計を新しい数として再処理
            digit_sum = 0;
        }
        digit_sum += n % 10; // 最下位の桁を加算
        n /= 10;             // 桁を一つ削る
    }
    return (digit_sum == 1);
}

int main() {
    int number = 50311;
    if (isMagicNumber(number)) {
        cout << number << " is magic number";
    } else {
        cout << number << " is not magic number";
    }
}

実行結果

50311 is magic number

アルゴリズムの解説

このプログラムの仕組みは以下の通りです。

1. 各桁の抽出: n % 10 で最下位の桁を取り出し、n /= 10 でその桁を削除します。これを n が0になるまで繰り返し、各桁の合計を digit_sum に蓄積します。

2. 再帰的な合計: n が0になった時点で、まだ合計が2桁以上(digit_sum > 9)であれば、その合計値を新たな n として同じ処理を繰り返します。

3. 判定: ループを抜けたときに digit_sum が1であれば、その数はマジックナンバーです。

なお、マジックナンバーの判定にはデジタルルート(digital root)の性質を利用する方法もあります。数を9で割った余りを用いることで、より効率的に判定することも可能です。具体的には、数が正であり n % 9 == 1 を満たす場合、その数はマジックナンバーであると分かります。

  1. C++で数値が2つの三角数の和として表現できるか判定する方法

    本記事では、ある整数が2つの三角数の和として表現できるかどうかを判定する方法を、C++のコード例とともに分かりやすく解説します。三角数とは三角数とは、1、3、6、10、15…のように、1から順に自然数を加算して得られる数列のことです。点を正三角形の形に並べたときの個数に対応することから「三角数」と呼ばれています。n番目の三角数は次の式で求められます。n × (n + 1) / 2例えば、1、3、6、10などが三角数に該当します。これらを利用すると、16は「6 + 10」という2つの三角数の和として表現できます。判定アルゴリズム判定の手順は非常にシンプルです。N未満のすべての三角数を生成し、セッ

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

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