C 言語で数を素数かどうか判定する方法

CBeginner
オンラインで実践に進む

はじめに

この実験では、C プログラミングで数が素数かどうかを調べる方法を学びます。この実験は 3 つのステップから構成されています。ユーザーから整数を入力を読み取り、2 からその数の平方根までの範囲で割り切れるかどうかをテストし、その数が素数かどうかを出力します。この実験の終わりまでに、与えられた整数の素数性を判断できる動作するプログラムを作成します。

この実験は、scanf() 関数を使用してユーザーから整数を入力を読み取る方法を最初に学びます。次に、入力された数の平方根まで 2 から割り切れるかどうかをテストする素数判定アルゴリズムを紹介します。除数が見つからない場合、その数は素数と見なされます。最後に、プログラムは結果を出力し、その数が素数かどうかを示します。

整数の入力

このステップでは、C プログラミングでユーザーから整数を入力する方法を学びます。これは、素数チェッカーを作成する最初のステップです。

まず、素数チェッカープログラム用の新しい C ファイルを作成しましょう。

cd ~/project
nano prime_checker.c

次に、整数を取得するコードを記述します。

#include <stdio.h>

int main() {
    int number;

    printf("素数かどうかを調べる正の整数を入力してください:");
    scanf("%d", &number);

    printf("入力された値は:%d\n", number);

    return 0;
}

出力例:

素数かどうかを調べる正の整数を入力してください: 17
入力された値は: 17

コードを詳しく見てみましょう。

  • #include <stdio.h> は標準入出力ライブラリを含みます。
  • int main() はプログラムの実行が開始されるメイン関数です。
  • int number; はユーザー入力の格納先となる整数変数を宣言します。
  • printf() はユーザーへのプロンプトを表示します。
  • scanf() はユーザーからの整数入力を読み取り、number に格納します。
  • printf() はユーザーが入力した数値を確認します。

プログラムをコンパイルして実行します。

gcc prime_checker.c -o prime_checker
./prime_checker

2 から √n までの割り切れるかのテスト

このステップでは、入力された数の平方根までをテストすることで、素数判定アルゴリズムを実装します。

以前の C プログラムを修正して、素数判定ロジックを追加しましょう。

nano ~/project/prime_checker.c

割り切れるかのテストを追加したコードを更新します。

#include <stdio.h>
#include <math.h>

int is_prime(int number) {
    // 2 より小さい数は素数ではない
    if (number < 2) {
        return 0;
    }

    // 2 から数の平方根まで割り切れるかをチェック
    for (int i = 2; i <= sqrt(number); i++) {
        if (number % i == 0) {
            return 0; // 割り切れる場合は素数ではない
        }
    }

    return 1; // 除数が見つからない場合は素数
}

int main() {
    int number;

    printf("素数かどうかを調べる正の整数を入力してください:");
    scanf("%d", &number);

    if (is_prime(number)) {
        printf("%d は素数です。\n", number);
    } else {
        printf("%d は素数ではありません。\n", number);
    }

    return 0;
}

数学ライブラリを使用してプログラムをコンパイルします。

gcc ~/project/prime_checker.c -o ~/project/prime_checker -lm

出力例:

素数かどうかを調べる正の整数を入力してください: 17
17 は素数です。

素数かどうかを調べる正の整数を入力してください: 20
20 は素数ではありません。

実装に関する重要な点:

  • <math.h> からの sqrt() 関数は平方根を計算します。
  • アルゴリズムを最適化するために、√n までしか割り切れるかをチェックしません。
  • 除数が見つからない場合、その数は素数です。
  • モジュロ演算子 % は割り切れるかをチェックします。
  • 素数でない場合は 0、素数の場合 1 を返します。

素数かどうか出力する

この最終ステップでは、素数判定プログラムを拡張して、より詳細な出力を行い、複数の数値のチェックを可能にします。

プログラムを修正して、より包括的な出力を提供します。

nano ~/project/prime_checker.c

改良されたインターフェースでコードを更新します。

#include <stdio.h>
#include <math.h>

int is_prime(int number) {
    // 2 より小さい数は素数ではない
    if (number < 2) {
        return 0;
    }

    // 2 から数の平方根まで割り切れるかをチェック
    for (int i = 2; i <= sqrt(number); i++) {
        if (number % i == 0) {
            return 0; // 割り切れる場合は素数ではない
        }
    }

    return 1; // 除数が見つからない場合は素数
}

void print_prime_details(int number) {
    if (is_prime(number)) {
        printf("%d は素数です!\n", number);
        printf("説明:\n");
        printf("- 1 と自分自身のみで割り切れます\n");
        printf("- 2 と √%d の間で他の約数は見つかりませんでした\n", number);
    } else {
        printf("%d は素数ではありません。\n", number);

        // 最小の約数を見つけて出力する
        for (int i = 2; i <= sqrt(number); i++) {
            if (number % i == 0) {
                printf("説明:\n");
                printf("- %d で割り切れます\n", i);
                printf("- %d × %d = %d\n", i, number / i, number);
                break;
            }
        }
    }
}

int main() {
    int number, continue_check;

    do {
        printf("素数かどうかを調べる正の整数を入力してください:");
        scanf("%d", &number);

        print_prime_details(number);

        printf("\n別の数値をチェックしますか? (1=はい,0=いいえ): ");
        scanf("%d", &continue_check);
    } while (continue_check == 1);

    printf("素数チェッカーの使用、ありがとうございました!\n");

    return 0;
}

プログラムをコンパイルします。

gcc ~/project/prime_checker.c -o ~/project/prime_checker -lm

出力例:

素数かどうかを調べる正の整数を入力してください: 17
17 は素数です!
説明:
- 1 と自分自身のみで割り切れます
- 2 と √17 の間で他の約数は見つかりませんでした

別の数値をチェックしますか? (1=はい, 0=いいえ): 1

素数かどうかを調べる正の整数を入力してください: 20
20 は素数ではありません。
説明:
- 2 で割り切れます
- 2 × 10 = 20

別の数値をチェックしますか? (1=はい, 0=いいえ): 0
素数チェッカーの使用、ありがとうございました!

主な改善点:

  • 素数と非素数の詳細な説明を追加しました。
  • ループを実装して、複数の数値のチェックを可能にしました。
  • 数値の性質に関するより教育的な出力を提供しました。

まとめ

この実験では、C プログラミングでユーザーから整数を入力する方法を学びました。これは、素数チェッカーを作成する最初のステップです。次に、入力された数の平方根までをテストすることで、素数判定アルゴリズムを実装しました。このプログラムは、与えられた数が素数かどうかを、2 からその数の平方根までの数値を繰り返しチェックし、それらのいずれかでその数が割り切れるかどうかを確認することで判定します。除数が見つからない場合、その数は素数と見なされます。