Cで完全数を判定する

More than 1 year has passed since last update.


前置き


はじめに

この記事は中学数学ではありません。

基本的に僕は興味の持ったことは全部やる方針なので色々な公式(ツェラーの公式のような)や、法則、アルゴリズムを今後もやっていきたいと思っています。できたらコメントで教えていただいたら嬉しいです。


完全数について


完全数って?


その数以外の約数の和がその数に等しい自然数



簡単な完全数は6です約数が1 , 2 , 3

1 + 2 + 3 = 6 = 1 * 2 * 3

という感じです。

Wikipediaを見た所非常に稀なようで、五つ目にはもうすでに3000万を超えているようです。


Cで完全数を判定する


変数を用意(宣言)する

最初はなるべく少なく済まそうと2つで頑張ったのですが大きい数字になった時のための処理速度を見通して3つでいきました。

判定する数字とfor文のカウンタ、約数の和の変数を宣言します。


main.c


int number; //判定する自然数を格納する変数
int i; //for文用のカウンタ
int wa = 0; //約数を足していく変数


Swiftでは自然数の型UInt64型などがあるのですがC言語についてはあまり詳しくないのでとりあえずint型にしました


判定する自然数を取得する

いつものようにprintfで入力を促してscanfで自然数を取得します


main.c


printf("自然数を入力してください = "); //printfで入力を促す
scanf("%d", &number); //入力した自然数をnumberに格納



本格的な計算

いよいよプログラムを書いていきます

仕組み的にはカウンタを約数にしてどんどん用意した変数に足していくプログラムになっています


main.c


//1~number-1の約数を調べるためのfor文
for (i = 1; i < number; i++) {
//numberがiで割り切れた時の条件(iがnumberの約数)
if (number % i == 0) {
//waにiを足していく
wa += i;
}
}


そして最後に審判の時ですw


main.c


//waがnumberと等しかったら(完全数だったら)
if (wa == number) {
printf("その数字は完全数です"); //完全数と判定
}
//wa(約数)が1だったら(素数)
else if (wa == 1){
printf("もしかしてそれは素数カモ!?"); //素数と判定
}
//それ以外の数
else {
printf("完全数ではありません"); //完全数(や素数)ではないと判定
}


気分で「素数かもしれない」判定も追加しました。(本当に素数かどうかは自信がないのでw)


ソースコード


main.c


#include <stdio.h>

int main() {

int number; //判定する自然数を格納する変数
int i; //for文用のカウンタ
int wa = 0; //約数を足していく変数

printf("自然数を入力してください = "); //printfで入力を促す
scanf("%d", &number); //入力した自然数をnumberに格納

//1~number-1の約数を調べるためのfor文
for (i = 1; i < number; i++) {
//numberがiで割り切れた時の条件(iがnumberの約数)
if (number % i == 0) {
//waにiを足していく
wa += i;
}
}

//waがnumberと等しかったら(完全数だったら)
if (wa == number) {
printf("その数字は完全数です"); //完全数と判定
}
//wa(約数)が1だったら(素数)
else if (wa == 1){
printf("もしかしてそれは素数カモ!?"); //素数と判定
}
//それ以外の数字
else {
printf("完全数ではありません"); //完全数(や素数)ではないと判定
}

}


完全数は少ない上に、とんでもなく大きい数字なので判定できる数が本当に限られていますが、倍積完全数判定の機能を追加するなどして使う機会を増やせると思います。

ちなみに僕がやった時は33550336(五番目の完全数)までしかできませんでした、、、

ありがとうございました。