7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Cで完全数を判定する

Posted at

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

##完全数について

完全数って?

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

簡単な完全数は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(五番目の完全数)までしかできませんでした、、、

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

7
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?