ホームページ >バックエンド開発 >C++ >最初の N 個の素数を生成する最もエレガントな方法は何ですか?

最初の N 個の素数を生成する最もエレガントな方法は何ですか?

DDD
DDDオリジナル
2025-01-13 08:12:43201ブラウズ

What's the Most Elegant Method for Generating the First N Prime Numbers?

素数を生成するエレガントな方法

目標は、最初の generatePrimes(n) 素数を返す関数 n を作成することです。この機能を実現するには複数の方法があり、それぞれに長所と短所があります。この記事では、最もエレガントな方法について説明します。

元のアプローチでは通常、ネストされたループを使用して素数をチェックします。このアプローチは機能しますが、反復的で入れ子になった構造のため、優雅さに欠けます。より洗練されたアプローチは、時間計算量が O(n log log n) のエラトステネスのふるいを使用することです。

エラトステネスのふるいは、すべての要素が最初に true に設定された、サイズ n のブール配列を作成することによって機能します。配列インデックスは 0 から n-1 までの数値を表します。アルゴリズムは、インデックス 0 と 1 の要素が素数ではないため、最初に false に設定します。次に、インデックス i ごとに、配列内の i の倍数をすべて false に設定します。このプロセスは、n の平方根までのすべてのインデックスに対して繰り返されます。配列内の残りの true 要素は素数を表します。

以下は、エラトステネスの篩のエレガントな Java 実装です:

<code class="language-java">public static List<Integer> generatePrimes(int n) {
    if (n <= 0) {
        return new ArrayList<>();
    }
    boolean[] isPrime = new boolean[n + 1];
    Arrays.fill(isPrime, true);
    isPrime[0] = isPrime[1] = false;
    for (int p = 2; p * p <= n; p++) {
        if (isPrime[p]) {
            for (int i = p * p; i <= n; i += p) {
                isPrime[i] = false;
            }
        }
    }
    List<Integer> primes = new ArrayList<>();
    for (int i = 2; i <= n; i++) {
        if (isPrime[i]) {
            primes.add(i);
        }
    }
    return primes;
}</code>

このコードは、エラトステネスのふるいを使用して、最初の n 素数を効率的かつエレガントに生成します。時間計算量は O(n log log n) で、コードは簡潔かつ明確で、素数の生成に最適です。

以上が最初の N 個の素数を生成する最もエレガントな方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。