Java 素数をチェックするプログラム(例付き)

⚡ スマートサマリー

Java 素数判定プログラムは、単一の整数が割り切れるかどうかを判定し、素数か合成数かを分類する方法を示します。この記事では、数学的な定義、ループロジック、実行可能な完全なコード、平方根最適化、計算量の比較、および初心者がよく犯す間違いについて解説します。

  • 🔢 定義ルール: 素数とは、1より大きい自然数で、約数がちょうど2つ(1とその数自身)しかない数のことである。
  • 🔁 ループロジック: 候補数を2からその数の半分までのすべての整数で割り、余りがゼロになるかどうかを記録します。
  • 🚩 旗のパターン: ブール変数に判定結果が格納され、約数が見つかった瞬間にbreak文によってループが終了します。
  • √ 平方根最適化: 平方根までの除数のみをテストすることで、反復回数をn/2から√nに減らすことができ、結果は変わりません。
  • ⚠️ エッジケース: 0、1、および負の値は決して素数ではなく、2は唯一の偶数の素数である。
  • 豪華<XNUMXxXNUMXF><XNUMXxXNUMXF><XNUMXxBXNUMX><XNUMXxBXNUMX>️ 複雑さの比較: 基本的なループはO(n)の時間で実行され、平方根法はO(√n)の時間で実行されます。
  • 🧪 検証手順: 1、2、9、17、97の値をそれぞれ用いてテストを行い、すべての境界条件を確認してください。

Java 素数をチェックするプログラム

素数とは何ですか?

素数とは、1より大きい自然数で、1と1自身以外では割り切れない数のことです。例えば、11は1と1自身以外では割り切れません。その他の素数は、2、3、5、7、11、13、17などであり、この数列は無限に続きます。

1より大きい素数でない数は、より小さな因数から構成されるため、合成数と呼ばれます。例えば、9は3で割り切れるので合成数であり、15は3と5で割り切れるので合成数です。

注意: 0と1は素数ではありません。2は唯一の偶数の素数であり、負の値は決して素数とはみなされません。

数が素数かどうかを確認する方法 Java

検証方法は、単純な割り算テストです。候補となる値を、より小さい整数で順番に割り算し、剰余演算子によって返される余りを調べます。余りがゼロであれば、約数が存在することが証明され、その数値は即座に不適格と判断されます。

プログラムロジック:

  • 入力された数値(例えば17)を2から17までの値で割り、余りを調べます。余りが0であれば、その数値は素数ではありません。
  • 半分以上で割り切れる数はありません。 したがって、私たちは次のことを行う必要があります ループ ただを通して numberToCheck/2入力が17の場合、半分は8.5となり、ループは2から8までの値を繰り返します。
  • numberToCheck が別の数で完全に割り切れる場合、フラグ isPrime は次のように設定されます。 false そしてループは終了します。

ツー Java 特徴はアルゴリズム全体を担います。剰余演算子 % 整数除算の余りを返します。 break この文は答えがわかった時点でループを停止するため、不要な反復処理は実行されません。

Java 数が素数かどうかを判定するプログラム

以下のプログラムは、変数 numberToCheck に値 17 を代入し、除算の各ステップを逐一出力します。これにより、計算過程を一行ずつ確認できます。コードは編集可能なので、値を変更して、21 などの合成数で再度実行し、逆の結果を確認してみてください。

public class PrimenumberToCheckCheck {

 public static void main(String[] args) {
  int remainder;
  boolean isPrime=true;
  int numberToCheck=17; // Enter the number you want to check for prime

  //Loop to check whether the number is divisible by any number other than 1 and itself
  for(int i=2;i<=numberToCheck/2;i++)
  {
   //number is divided by i
            remainder=numberToCheck%i;
            System.out.println(numberToCheck+" Divided by "+ i + " gives a remainder "+remainder);

       //if remainder is 0 then the number is not prime and we break the loop. Else continue the loop
     if(remainder==0)
     {
        isPrime=false;
        break;
     }
  }
  // Check value true or false, if isPrime is true then the number is prime otherwise not prime
  if(isPrime)
     System.out.println(numberToCheck + " is a Prime number");
  else
     System.out.println(numberToCheck + " is not a Prime number");
    }
  }

期待される出力:

17 Divided by 2 gives a remainder 1
17 Divided by 3 gives a remainder 2
17 Divided by 4 gives a remainder 1
17 Divided by 5 gives a remainder 2
17 Divided by 6 gives a remainder 5
17 Divided by 7 gives a remainder 3
17 Divided by 8 gives a remainder 1
17 is a Prime number

17÷2は整数演算で8となるため、ループは8で停止します。余りがゼロになることは一度もないため、isPrimeフラグは初期値のtrueを維持し、最終条件で正の判定が出力されます。

平方根法を用いた最適化された素数判定

数の半分までを割り算するのは正しい方法ですが、無駄があります。数 n の約数が平方根より大きい場合、対応する約数は平方根より小さくなければならないため、既に発見されているはずです。したがって、√n までを割り算することで、はるかに少ない反復回数で同じ答えが得られます。

public class PrimeCheckOptimized {

    public static boolean isPrime(int n) {
        // 0, 1 and negative values are never prime
        if (n <= 1) {
            return false;
        }
        // 2 is the only even prime number
        if (n == 2) {
            return true;
        }
        if (n % 2 == 0) {
            return false;
        }
        // test only odd divisors up to the square root
        for (int i = 3; i * i <= n; i += 2) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        int[] samples = {1, 2, 9, 17, 97};
        for (int value : samples) {
            System.out.println(value + " is prime: " + isPrime(value));
        }
    }
}

出力:

1 is prime: false
2 is prime: true
9 is prime: false
17 is prime: true
97 is prime: true

条件 i * i <= n Math.sqrt への浮動小数点演算呼び出しを回避し、ステップ値 2 によって偶数による約数をスキップします。例えば 1,000,003 のような値の場合、基本的なループでは約 500,000 回繰り返されますが、このバージョンでは 500 回未満で済みます。

ユーザーが入力した素数をチェックする

ハードコードされた入力はデモンストレーションには便利ですが、実際の演習では通常キーボード入力が求められます。Scannerクラスはコンソールから整数を読み込み、同じisPrimeメソッドに渡します。

import java.util.Scanner;

public class PrimeCheckUserInput {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter a number: ");
        int number = sc.nextInt();

        boolean isPrime = number > 1;
        for (int i = 2; i * i <= number; i++) {
            if (number % i == 0) {
                isPrime = false;
                break;
            }
        }

        System.out.println(number + (isPrime ? " is a Prime number" : " is not a Prime number"));
        sc.close();
    }
}

サンプル実行例:

Enter a number: 29
29 is a Prime number

💡ヒント: フラグを初期化します number > 1 単一の式で値0、1、およびすべての負の入力を処理するため、別のガード句が不要になります。

素数プログラムを作成する際によくある間違い

誤った提出物のほとんどは、メインループではなく境界値でエラーが発生します。以下に、初心者のコードで最もよく発生するエラーの一覧を示します。

  1. ループを1から開始します。 すべての整数は1で割り切れるため、フラグはすぐにfalseに設定され、プログラムはどの数も素数ではないと報告します。
  2. 1を素数として扱う: 値1は約数を1つしか持たないため、2つの約数の定義を満たさず、falseを返す必要があります。
  3. break文を省略する: プログラムは正しい答えを返すものの、判定結果が判明した後も繰り返し処理を行うため、入力値が大きい場合に時間を浪費してしまう。
  4. 使い方 i <= n 境界として: その数は常に自身を割り切るので、ループはnに到達する前に停止しなければならない。
  5. との比較 = ==: 単一の等号は、値をテストするのではなく代入するため、if文の条件式でコンパイル時エラーが発生します。

素因数判定方法の比較

入力値のサイズと、単一の値をテストする必要があるか、範囲全体をテストする必要があるかに応じて、適切な方法を選択してください。

方法 除数範囲テスト済み 時間の複雑さ 最適な
基本ループ 2からn-1 O(N) コアロジックを学ぶ
半分の分割 2からn/2 O(N) 入力は少なく、コードもシンプルです。
平方根法 2から√n O(√n) 単一の大きな値
エラトステネスのふるい 事前計算済みテーブル O(n log log n) 範囲内のすべての素数を列挙する

単一の値ではなく範囲全体を分類する必要がある場合は、ふるい分けの方がはるかに効率的です。 素数 Numbers 1から100へ このパターンを示しています。関連するループ駆動演習については、以下を参照してください。 フィボナッチ数列 Java Java 回文プログラム Bubbleソートアルゴリズム Java旗の宣言とカウンターについて復習が必要な初心者は、以下をお読みください。 Java variables 概して Java チュートリアル.

よくあるご質問

いいえ。数1は約数が1つしかないため、2つの約数を持つという定義を満たしません。正しいプログラムは、1、0、およびすべての負の整数に対してfalseを返す必要があります。

約数はペアで出現します。平方根より大きい約数が存在する場合、そのペアとなる約数は平方根より小さく、既に検証済みであるため、追加のチェックは不要です。

はい。パラメータの型をintからlongに変更し、ロジックはそのままにしてください。64ビットを超える値の場合は、試行除算の代わりにBigIntegerとそのisProbablePrimeメソッドを使用してください。

はい。ループの前にカウンターを宣言し、同じ条件をwhileヘッダーに記述し、ループ本体内でカウンターをインクリメントしてください。出力は変わりません。

通常はそうですが、生成されたコードでは0、1、および負の入力に対するガードが省略されていることがよくあります。AIが作成した実装を受け入れる前に、必ず自分で境界テストを実行してください。

素数は、モデルAPIや保存されたデータセットを保護するハッシュ関数、乱数生成、RSA暗号化の基盤となるものです。ハッシュテーブルのサイズは、鍵を均等に分散させるために、しばしば素数として選択されます。