C言語で完全数を判定するプログラムの作り方【サンプルコード付き】
完全数(Perfect Number)とは、その数の約数の総和が「元の数 × 2」と等しくなる自然数のことです。別の見方をすると、自分自身を除く約数の合計が元の数そのものと一致する数とも言えます。
代表的な完全数の例をいくつか挙げてみましょう。
- 6:約数は 1, 2, 3, 6 → 合計は 1+2+3+6 = 12 = 6×2 なので完全数
- 28:約数は 1, 2, 4, 7, 14, 28 → 合計は 56 = 28×2 なので完全数
この記事では、C言語を使って入力された整数が完全数であるかどうかを判定するプログラムを、アルゴリズムから順にわかりやすく解説します。
アルゴリズム
完全数を判定するための手順は以下の通りです。
START Step 1: int型変数を宣言し、result を 0 で初期化する Step 2: 実行時に数値を読み込む Step 3: for文で i=1; i<=number; i++ と繰り返す 条件を満たす場合 i. if(number%i==0) ならば i は約数 ii. result = result + i として加算する Step 4: 約数の合計を判定する i. if(result == 2*number) ならば ii. 「perfect number(完全数)」と表示 iii. それ以外は「not perfect number(完全数ではない)」と表示 STOP
つまり、1から入力値までのすべての整数で割り切れるかどうかを確認し、約数だけを合計。最後にその合計が入力値の2倍と一致するかを調べるというシンプルなロジックです。
サンプルプログラム
以下は、与えられた数が完全数かどうかを判定するCプログラムです。
#include<stdio.h>
int main(){
int number,i,result=0;// 変数を宣言し、result を 0 で初期化
printf("enter the number:");
scanf("%d",&number);
for(i=1;i<=number;i++){
if(number%i==0)
result=result+i;
}
if(result==2*number) // 約数の合計が 2*number と一致するか確認
printf("perfect number");
else
printf("not perfect number");
}コードのポイント
- 変数 result には約数の合計が格納されるため、必ず 0 で初期化します。
- for文の中で number % i == 0 を判定することで、i が number の約数かどうかを確認しています。
- ループ終了後、result == 2*number が成立すれば完全数と判断できます。
実行結果
実際の実行例は以下の通りです。
enter the number:28 perfect number enter the number:46 not perfect number
28 を入力した場合は約数の合計が 56(=28×2)となるため「perfect number」と表示され、46 を入力した場合は条件を満たさないため「not perfect number」と表示されます。
まとめ
完全数の判定は、「約数をすべて求めて合計し、元の数の2倍と比較する」という基本的な考え方だけで実装できます。for文による繰り返し処理と剰余演算子(%)の使い方を理解する絶好の練習題材なので、ぜひ自分でもコードを書いて動かしてみてください。
-
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 で割った余り」