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

C言語で数値が強数(ストロングナンバー)かどうかを判定するプログラムの書き方

強数(ストロングナンバー)とは?

強数(Strong Number)とは、各桁の数字の階乗をすべて足し合わせた合計が、元の数値そのものと一致する数のことです。

例1:123 の場合

123! = 1! + 2! + 3!

= 1 + 2 + 6 = 9

各桁の階乗の合計は9となり、元の数値123と一致しないため、123は強数ではありません

例2:145 の場合

145! = 1! + 4! + 5!

= 1 + 24 + 120

= 145

各桁の階乗の合計が145となり、元の数値と一致しているため、145は強数です

判定のアルゴリズム

与えられた数値が強数かどうかを判定するには、以下の手順で処理を行います。

  1. 数値の下の桁から順に1桁ずつ取り出す(10で割った余りを求める)。
  2. 取り出した桁の値の階乗を計算する。
  3. その階乗を合計に加算し、数値を10で割って次の桁へ進む。
  4. すべての桁を処理し終えたら、合計が元の数値と一致するかを比較する。

この判定ロジックを擬似コードで表すと、次のようになります。

while(n){
    i = 1,fact = 1;
    rem = n % 10;
    while(i <= rem){
        fact = fact * i;
        i++;
    }
    sum = sum + fact;
    n = n / 10;
}
if(sum == temp)
    printf("%d is a strong number\n",temp);
else
    printf("%d is not a strong number\n",temp);

C言語による完全なプログラム

以下は、入力された数値が強数かどうかを判定するC言語のサンプルプログラムです。

#include<stdio.h>
int main(){
    int n,i;
    int fact,rem;
    printf("\nEnter a number : ");
    scanf("%d",&n);
    printf("\n");
    int sum = 0;
    int temp = n;
    while(n){
        i = 1,fact = 1;
        rem = n % 10;
        while(i <= rem){
            fact = fact * i;
            i++;
        }
        sum = sum + fact;
        n = n / 10;
    }
    if(sum == temp)
        printf("%d is a strong number\n",temp);
    else
        printf("%d is not a strong number\n",temp);
    return 0;
}

このプログラムのポイントは、temp変数に入力値のコピーを保存しておくことです。ループ内でnは10で割られて徐々に0へ近づくため、最後の比較には元の値が必要になります。また、内側のループに入る前にifactを毎回初期化することで、各桁ごとに正しく階乗が計算されます。

実行結果

上記のプログラムをコンパイルして実行すると、以下のような出力が得られます。

Run 1:
Enter a number : 145
145 is a strong number
Run 2:
Enter a number : 25
25 is not a strong number

1つ目の実行例では145を入力しており、各桁の階乗の合計が145と一致するため「strong number(強数)」と判定されています。一方、2つ目の例では25を入力しました。2! + 5! = 2 + 120 = 122となり、25と一致しないため「not a strong number」と表示されます。

まとめ

強数の判定は「桁の分解」「階乗の計算」「合計との比較」という3つの基本的な処理を組み合わせるだけで実装できます。剰余演算子(%)と整数除算(/)を使いこなせば、桁ごとの操作が簡単に行えるため、初心者の方にもおすすめの練習問題です。ぜひ実際にコードを動かして、さまざまな数値で試してみてください。

  1. Pythonで整数の2進表現に含まれる1のビット数を数える方法

    ある整数 n が与えられたとき、その数を2進数で表した際に含まれる「1」のビット(セットビット)の個数を求めることを考えます。この問題は「ポピュレーションカウント」や「ハミング重み」と呼ばれることもあり、ビット演算の基礎を学ぶのに最適な題材です。問題の例例えば、入力が 12 の場合を考えてみましょう。12 を2進数で表すと 1100 となり、「1」のビットは2個含まれています。したがって、出力は 2 になります。解法のアプローチこの問題は、次の手順で解くことができます。カウンター変数 count を 0 で初期化するn が 0 になるまで以下を繰り返すn の最下位ビット(n AND 1)を c

  2. Pythonで数値の各桁の合計を求める方法(文字列を使わない実装)

    ある数値 num が与えられたとき、その各桁の数字をすべて足し合わせた合計を求めます。ここでは、文字列に変換せず、数値演算だけで解く方法を紹介します。たとえば、入力が num = 512 の場合、5 + 1 + 2 = 8 となるため、出力は 8 になります。解き方の手順合計を格納する変数 sum を 0 で初期化します。num が 0 になるまで、次の処理を繰り返します。sum に「num を 10 で割った余り」(最下位の桁)を加算します。num を「10 で割った商」(整数)で更新します。繰り返しが終わったら sum を返します。アルゴリズムのポイントこの手法では、「10 で割った余り」