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桁ずつ取り出す(10で割った余りを求める)。
- 取り出した桁の値の階乗を計算する。
- その階乗を合計に加算し、数値を10で割って次の桁へ進む。
- すべての桁を処理し終えたら、合計が元の数値と一致するかを比較する。
この判定ロジックを擬似コードで表すと、次のようになります。
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へ近づくため、最後の比較には元の値が必要になります。また、内側のループに入る前にiとfactを毎回初期化することで、各桁ごとに正しく階乗が計算されます。
実行結果
上記のプログラムをコンパイルして実行すると、以下のような出力が得られます。
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つの基本的な処理を組み合わせるだけで実装できます。剰余演算子(%)と整数除算(/)を使いこなせば、桁ごとの操作が簡単に行えるため、初心者の方にもおすすめの練習問題です。ぜひ実際にコードを動かして、さまざまな数値で試してみてください。
-
Pythonで整数の2進表現に含まれる1のビット数を数える方法
ある整数 n が与えられたとき、その数を2進数で表した際に含まれる「1」のビット(セットビット)の個数を求めることを考えます。この問題は「ポピュレーションカウント」や「ハミング重み」と呼ばれることもあり、ビット演算の基礎を学ぶのに最適な題材です。問題の例例えば、入力が 12 の場合を考えてみましょう。12 を2進数で表すと 1100 となり、「1」のビットは2個含まれています。したがって、出力は 2 になります。解法のアプローチこの問題は、次の手順で解くことができます。カウンター変数 count を 0 で初期化するn が 0 になるまで以下を繰り返すn の最下位ビット(n AND 1)を c
-
Pythonで数値の各桁の合計を求める方法(文字列を使わない実装)
ある数値 num が与えられたとき、その各桁の数字をすべて足し合わせた合計を求めます。ここでは、文字列に変換せず、数値演算だけで解く方法を紹介します。たとえば、入力が num = 512 の場合、5 + 1 + 2 = 8 となるため、出力は 8 になります。解き方の手順合計を格納する変数 sum を 0 で初期化します。num が 0 になるまで、次の処理を繰り返します。sum に「num を 10 で割った余り」(最下位の桁)を加算します。num を「10 で割った商」(整数)で更新します。繰り返しが終わったら sum を返します。アルゴリズムのポイントこの手法では、「10 で割った余り」