Java プライムを印刷するプログラム Numbers 1から100へ

⚡ スマートサマリー

1から100までの素数を印刷するプログラム Java 指定された範囲内のすべての値をスキャンし、約数がちょうど2つある値のみを報告します。この記事では、定義、検証方法、完全なプログラム、エラトステネスの篩、および検証済みの出力とのパフォーマンス比較について説明します。

  • 🔢 定義ルール: 素数とは、1より大きく、1と自分自身以外では割り切れない数のことであり、0と1は素数には含まれません。
  • 🔁 範囲スキャン: 外側のループは2から上限までを順に処理し、各値を再利用可能なチェックメソッドに委任します。
  • ブール演算: CheckPrimeは、最初に見つかった約数に対してfalseを返し、一致する約数が見つからずにループが完了した場合はtrueを返します。
  • 除数境界: 値の半分までテストすれば正しいので、停止します。ping 平方根を使うと、同じ答えがはるかに速く得られます。
  • 🧮 結果セット: 1から100までの間には、ちょうど25個の素数が存在し、末尾は97である。
  • ふるい分け法: エラトステネスの篩は、ブール配列内の倍数をマークし、O(n log log n) の時間で実行されます。
  • 🧪 検証手順: 実装を信頼する前に、2が含まれ、1が除外されていることを確認してください。

素数 Numbers 1から100インチ Java

素数とは何ですか?

A 素数 素数とは、1とそれ自身以外では割り切れない数のことです。1より大きい自然数で、2つのより小さい自然数の積では表せない数です。例えば、11は1とそれ自身以外では割り切れません。その他の素数には、2、3、5、7、11、13、17などがあります。

注意: 0 と 1 は素数ではありません。2 は唯一の偶数の素数です。

1から100までの間には、ちょうど25個の素数があります。下の表は、素数を10の位ごとにグループ分けしたもので、値が大きくなるにつれて数が減っていくパターンが視覚的に分かりやすくなっています。

レンジ 素数 Numbers 数量カウント
1 – 20 2、3、5、7、11、13、17、19 8
21 – 40 23、29、31、37 4
41 – 60 41、43、47、53、59 5
61 – 80 61、67、71、73、79 5
81 – 100 83、89、97 3

プライムの印刷方法 Numbers 1から100までのプログラム Java

以下は Java 1 から 100 までの素数を印刷するプログラム:

プログラムロジック:

  • 主な方法は 素数プログラム Java 1から100までの素数を1つずつチェックするループが含まれています。
  • main メソッドはメソッドを呼び出します CheckPrime ある数が素数かどうかを判定するには Java どうか。
  • 入力された数値(例えば17)を2から17までの値で割り、余りを調べます。余りが0であれば、その数値は素数ではありません。
  • 数は、その数の半分より小さい数で割り切れることはありません。したがって、numberToCheck/2 だけをループ処理すれば十分です。入力が 17 の場合、半分は 8.5 なので、ループ処理では 2 から 8 までの値を繰り返します。
  • If numberToCheck が他の数で完全に割り切れる場合、false を返し、ループを終了します。
  • If numberToCheck が素数の場合、true を返します。
  • 1から100までの素数の主な方法では JavaisPrimeが TRUE そしてその値を素数に加えるNumbers文字列が見つかりました。
  • 最後に、1から100までの素数を印刷します。 Java.

チェック処理を独立したメソッドに分離することで、プログラムの再利用性が向上します。同じ CheckPrime メソッドは、maxCheck 変数を変更するだけで、任意の上限値を指定して呼び出すことができます。

public class PrimeNumbers {

    public static void main(String[] args) {

        int i;
        int num = 0;
        int maxCheck = 100; // maxCheck limit till which you want to find prime numbers
        boolean isPrime = true;

        //Empty String
        String primeNumbersFound = "";

        //Start loop 2 to maxCheck
        for (i = 2; i <= maxCheck; i++) {
            isPrime = CheckPrime(i);
            if (isPrime) {
                primeNumbersFound = primeNumbersFound + i + " ";
            }
        }
        System.out.println("Prime numbers from 1 to " + maxCheck + " are:");
        // Print prime numbers from 1 to maxCheck
        System.out.println(primeNumbersFound);
    }
    public static boolean CheckPrime(int numberToCheck) {
        int remainder;
        for (int i = 2; i <= numberToCheck / 2; i++) {
            remainder = numberToCheck % i;
            //if remainder is 0 then the number is not prime and we break the loop. Else continue the loop
            if (remainder == 0) {
                return false;
            }
        }
        return true;

    }

}

期待される出力:

1から100までの素数の出力 Java プログラム 次のようになります。

Prime numbers from 1 to 100 are:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

値2は、内側のループ条件を満たすため合格します。 i <= 2 / 2 評価する 2 <= 1これはすぐに偽となるため、このメソッドは除算を一切行わずに真を返します。

平方根境界を使用した最適化バージョン

数の半分までを割り算するのは正しいですが、不必要な作業です。平方根の周りでは常に約数がペアになっているため、√n より大きい約数には、すでにテスト済みの対応する約数が必ず存在します。

public class PrimeNumbersOptimized {

    public static void main(String[] args) {
        int maxCheck = 100;
        int count = 0;
        StringBuilder result = new StringBuilder();

        for (int i = 2; i <= maxCheck; i++) {
            if (isPrime(i)) {
                result.append(i).append(" ");
                count++;
            }
        }

        System.out.println("Prime numbers from 1 to " + maxCheck + " are:");
        System.out.println(result.toString().trim());
        System.out.println("Total primes found: " + count);
    }

    public static boolean isPrime(int n) {
        if (n <= 1) return false;
        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;
    }
}

出力:

Prime numbers from 1 to 100 are:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Total primes found: 25

💡ヒント: StringBuilder はループ内の繰り返し文字列連結を置き換えます。 += 文字列に対して操作を行うと新しいオブジェクトが作成され、上限が数千に達すると計測可能になります。

プリントプライム Numbers エラトステネスの篩の使用

範囲内のすべての素数が必要な場合、試行除算は適切な方法ではありません。エラトステネスの篩はブール配列を作成し、各素数の倍数を合成数としてマークし、マークされていない残りの数を読み取ります。

この方法は3つのステップで機能します。

  1. サイズn+1のブール配列を作成し、2以上のインデックスはすべて素数であると仮定します。
  2. 2から始めて、現在の素数の倍数をすべて合成数としてマークします。
  3. 次の未マークのインデックスに進み、nの平方根を超えるまでこれを繰り返します。
import java.util.Arrays;

public class SieveOfEratosthenes {

    public static void main(String[] args) {
        int n = 100;
        boolean[] composite = new boolean[n + 1];

        for (int p = 2; p * p <= n; p++) {
            if (!composite[p]) {
                // start at p*p because smaller multiples are already marked
                for (int multiple = p * p; multiple <= n; multiple += p) {
                    composite[multiple] = true;
                }
            }
        }

        StringBuilder result = new StringBuilder();
        for (int i = 2; i <= n; i++) {
            if (!composite[i]) {
                result.append(i).append(" ");
            }
        }

        System.out.println("Prime numbers from 1 to " + n + " are:");
        System.out.println(result.toString().trim());
    }
}

出力:

Prime numbers from 1 to 100 are:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

3つのアプローチの比較

3つのプログラムはすべて同じ25個の値を出力するので、選択は範囲の大きさに完全に依存します。

アプローチ 時間の複雑さ 追加メモリ ベストレンジ
n/2への試行分割 O(n²) O(1) 数千まで
√n への試行除算 O(n√n) O(1) 数十万まで
エラトステネスのふるい O(n log log n) O(N) 何百万もの価値

プログラムをチェックして 任意の入力数値からの素数 範囲ではなく単一の値をテストする必要がある場合。ループ駆動の演習については、以下を参照してください。 フィボナッチ数列 Java Java 回文プログラム Bubbleソートアルゴリズム Java篩で使用されるブール配列については、以下でさらに詳しく説明します。 Java アレイ.

よくあるご質問

数はちょうど25個です。数列は2から始まり97で終わり、値が大きくなるにつれて密度は着実に減少します。

内側のループ条件は 2 <= 1 となり、これはすぐに偽となるため、除算は実行されず、メソッドは真を返します。この単一のケースは、すべての実装でテストする価値があります。

maxCheck変数を500に変更してください。1より大きい値から始めるには、代わりに外側ループカウンタの初期値を調整し、チェック方法は変更しないでください。

pの倍数のうち、より小さいものはすべて既により小さい素因数を含んでおり、以前の段階で既にマークされている。pの2乗から始めることで、その作業を繰り返す必要がなくなる。

プロンプトで広い範囲や性能が指定されていない限り、通常は試行除算の結果が返されます。リクエストで上限値を指定すると、通常は代わりに篩除法が実行されます。

ハッシュテーブルと特徴バケットのサイズとして素数が選ばれるのは、キーを均等に分散させ、衝突を減らすことができるためです。また、特徴ベクトル化で使用されるハッシュ関数のシード値としても素数が用いられます。