記事内にはプロモーションが含まれています

【C言語】素数判定プログラムの作り方

【C言語】素数判定プログラムの作り方!関数化や高速化のアルゴリズム C言語

プログラミングの学習を進める中で、ループ処理や条件分岐の練習問題として必ずと言っていいほど登場するのが「素数判定プログラム」です。

C言語においても、数値を入力したときにそれが素数であるかどうかを正しく判定するロジックを組むことは、基本文法の習得を確認する上で非常に有効なステップとなります。

「素数かどうかの判定をどのようにコードで表現すればいいのか?」
「while文やfor文、関数の使い分けを知りたい」
「大きな数字でも一瞬で判定できる高速な方法はあるのか?」

このような疑問を解決するために、この記事ではC言語による素数判定の基本から、再利用性の高い関数化の手順、そして計算効率を劇的に高める数学的な工夫までを徹底的に解説します。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はプログラミングスクールを運営
  • モットーは「利他の精神」
💻 本記事の検証環境(2026年2月確認)
  • OS:Windows 11 / macOS Sequoia
  • IDE:Visual Studio / VS Code / IntelliJ IDEA
  • その他:Chrome DevTools / 各言語最新安定版

※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。

素数かどうかを判定する方法とは

素数とは、1とその数自身以外に正の約数を持たない、1より大きな自然数のことを指します。
つまり、2以上の整数nについて、2からn-1までのどの整数でも割り切れない場合に、その数は素数であると定義されます。

プログラムで素数を判定するための最も直感的なアプローチは、その数値を2から順に割っていき、一度でも割り切れる(余りが0になる)かどうかを調べる「試し割り法」です。

もし一度も割り切れずにチェックが終われば、その数は素数であると確定します。

for文とwhile文を使った素数判定プログラム

C言語のループ構文には for 文と while 文がありますが、どちらを使っても素数判定は可能です。

まずは、初心者の課題としてよく出される「数値を入力したときに素数かどうかを判定するプログラム」の基本形を見ていきましょう。

for文による基本的な実装

#include <stdio.h>

int main(void) {
    int n, i;
    int is_prime = 1; // 素数フラグ(1:素数, 0:素数でない)

    printf("判定したい数値を入力してください: ");
    scanf("%d", &n);

    if (n < 2) {
        is_prime = 0; // 1以下は素数ではない
    } else {
        for (i = 2; i < n; i++) {
            if (n % i == 0) {
                is_prime = 0; // 割り切れたら素数ではない
                break;        // これ以上ループする必要はない
            }
        }
    }

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

    return 0;
}

実行結果

判定したい数値を入力してください: 17
17 は素数です。

判定したい数値を入力してください: 15
15 は素数ではありません。

このプログラムでは、まず scanf を使ってユーザーから入力を受け取り、変数 n に格納しています。
素数の定義に従い、まず if (n < 2) によって1以下の数値は即座に除外されます。

メインのロジックである for ループでは、カウンタ変数 i を2から開始し、入力された数値 n の手前まで増やしながら、剰余演算子 % を使って余りを計算していきます。

もし n % i == 0 が真、つまり割り切れる数字が見つかった場合は、変数 is_prime を0に書き換えて break 文でループを強制終了させます。

最後に is_prime の値を評価し、1のままであれば一度も割り切れることなくチェックを通過したことを意味するため、素数であるという結果を表示させています。

whileを使った素数判定の書き方

特定の条件を満たすまで繰り返すという性質から、while 文を用いて実装することも可能です。

#include <stdio.h>

int main(void) {
    int n;
    int i = 2;

    printf("数値を入力してください: ");
    scanf("%d", &n);

    if (n < 2) {
        printf("%d は素数ではありません。\n", n);
        return 0;
    }

    // 割り切れるか、あるいはnに到達するまでループ
    while (n % i != 0) {
        i++;
    }

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

    return 0;
}

while 文を使ったこのプログラムでは、ループの条件式自体に n % i != 0 という判定を組み込んでいます。

これは「余りが0でない間は、次の数で割る(i++)を繰り返す」という非常に簡潔なロジックです。
ループを抜けたときの i の値に注目することで判定を行っています。

もし in と同じ値になっていれば、それは一度も自分より小さな数で割り切れずにループが終了したことを意味し、素数であることが証明されます。

逆に in より小さな値で止まっていれば、その数値は合成数であると判断できます。

汎用性を高めるC言語の素数判定関数

実際のアプリケーション開発では、同じ判定処理を何度も使い回せるように「関数」として定義するのがベストプラクティスです。

判定ロジックを独立させることで、コードが読みやすくなり、メンテナンス性も向上します。

判定関数を自作する

#include <stdio.h>

// 素数なら1を、そうでなければ0を返す関数
int is_prime_number(int n) {
    if (n < 2) return 0;
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) return 0;
    }
    return 1;
}

int main(void) {
    int num = 29;
    if (is_prime_number(num)) {
        printf("%d は素数です。\n", num);
    }
    return 0;
}

ここでは is_prime_number という名前の関数を定義しています。

この関数は引数として整数を受け取り、計算結果として真偽値のような整数(1または0)を返します。
関数の内部で return 文を使い、素数でないことが判明した瞬間に呼び出し元へ戻るため、main 関数側の記述が非常にスッキリします。

また、このコードではループの条件式に i * i <= n という工夫を取り入れています。
これは次のセクションで解説する「高速化」の非常に重要なテクニックの一つです。

関数としてロジックをカプセル化することで、アルゴリズムを改良した際の影響を最小限に抑えることができるようになります。

素数100個を順番に表示するプログラム

最後に応用編として、素数を特定個数(例えば100個)見つけるまで計算し続けるプログラムを紹介します。
これまで学んだ関数の知識を組み合わせることで、簡単に実装できます。

#include <stdio.h>

int is_prime(int n) {
    if (n < 2) return 0;
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) return 0;
    }
    return 1;
}

int main(void) {
    int count = 0;
    int num = 2;

    printf("最初の100個の素数を表示します:\n");

    while (count < 100) {
        if (is_prime(num)) {
            printf("%5d ", num);
            count++;
            if (count % 10 == 0) printf("\n"); // 10個ごとに改行
        }
        num++;
    }

    return 0;
}

このプログラムは、while 文を使って「見つかった素数の個数(count)」が100に達するまで処理を継続させます。

ループの中では、毎回 is_prime 関数を呼び出して現在の num が素数かどうかをチェックし、素数であれば画面に表示してカウントを増やします。

printf("%5d ", num) の部分は、出力の桁数を揃えて見やすくするための書式指定です。

また、count % 10 == 0 という判定を入れることで、10個ごとに改行を行い、結果を一覧として綺麗に整列させています。

このように基礎を積み重ねることで、より複雑な数値処理プログラムへと発展させることが可能になります。

C言語のスキルを活かして年収を上げる方法

以上、C言語での素数判定プログラムの作り方について解説してきました。

なお、C言語のスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。

C言語を扱えるエンジニアは比較的希少価値が高く、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。

なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
今すぐ転職する気がなくとも、とりあえず転職エージェントに無料登録しておくだけで、スカウトが届いたり、思わぬ好待遇の求人情報が送られてきたりするというメリットがあります。
併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなC言語の案件を探しやすくなります。

転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
エンジニアのキャリア・スキルアップ相談窓口
当ブログの読者に選ばれている、実績豊富な転職エージェントを厳選しました。
【転職】年収・環境を改善したい
年収アップにこだわりたい方 (平均アップ額138万円の実績)
未経験・経験者問わず幅広く探したい方
業界に精通した担当者に相談したい方
ゲーム業界への転職を志望する方
エンジニア未経験からキャリアを築く方
【独立】フリーランスとして稼ぎたい
国内最大級のフリーランス案件数から比較したい方
週1〜3日など柔軟な働き方を希望する方
【学習】スキルに不安のある方向け(格安スクール「デイトラ」)