C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で1からnまでの素数の積を求める方法

数値 n が与えられたとき、1 から n までの範囲に含まれる素数をすべて掛け合わせた積を求めることを考えます。例えば n = 7 の場合、素数は 2・3・5・7 なので、出力は 2 × 3 × 5 × 7 = 210 となります。

アプローチ:エラトステネスの篩

この問題を効率的に解くには、エラトステネスの篩(ふるい)と呼ばれる古典的なアルゴリズムを使います。この手法では、2 から始めて各素数の倍数を順に除外していくことで、1 から n までのすべての素数を高速に見つけることができます。その後、見つかった素数をすべて掛け合わせれば答えが得られます。

アルゴリズムの手順

  1. サイズ n+1 の真偽値配列を作成し、すべて true(素数候補)で初期化します。
  2. 2 から √n までの各数値 i について、i が素数なら i の倍数をすべて false にします。
  3. 最後に、配列内で true のまま残っている数値(=素数)をすべて掛け合わせます。

C++での実装例

#include<iostream>
using namespace std;

long PrimeProds(int n) {
    bool prime[n + 1];
    for(int i = 0; i <= n; i++){
        prime[i] = true;
    }
    // エラトステネスの篩で素数を判定
    for (int i = 2; i * i <= n; i++) {
        if (prime[i] == true) {
            for (int j = i * 2; j <= n; j += i)
                prime[j] = false;
        }
    }
    // 素数の積を計算
    long product = 1;
    for (int i = 2; i <= n; i++)
        if (prime[i])
            product *= i;
    return product;
}

int main() {
    int n = 8;
    cout << "Product of primes up to " << n << " is: " << PrimeProds(n);
}

実行結果

Product of primes up to 8 is: 210

コードの解説

n = 8 の場合、8 以下の素数は 2・3・5・7 の4つです。したがって積は 2 × 3 × 5 × 7 = 210 となり、プログラムの出力と一致します。

エラトステネスの篩の計算量は O(n log log n) であり、単純に各数値について素数判定を繰り返す方法(O(n√n))よりもはるかに高速です。そのため、n が大きくなっても効率よく動作します。

注意点

素数の積は非常に急速に大きくなるため、n がある程度大きくなると long 型でもオーバーフローする可能性があります。より大きな n を扱う場合は、unsigned long long 型を使うか、多倍長整数ライブラリ(GMP など)の利用を検討してください。

  1. C++で配列内の連続する素数の最大数を求める方法

    本記事では、ランダムな順序で並んだ整数の配列(サイズ N)の中から、連続して出現する素数の最長列を見つける方法を解説します。素数と非素数が混在する配列を走査し、最も長く続いた素数の個数を求めるのが目標です。素数とは、1とその数自身という2つの約数しか持たない数のことです。1、2、3、5、7、11、13などは素数であり、一方で4、6、8、9、10などの合成数は2つより多くの約数を持ちます。それでは、具体例で確認してみましょう。入力例と出力例入力 − Arr[] = { 1,3,5,2,6,7,13,4,9,10 }出力 − 3説明 − この配列に含まれる素数は 3,5,2,7,13 です。このう

  2. 【C++】配列内のすべての素数の積を求める方法

    整数型配列 arr[] が与えられたとき、その配列に含まれるすべての素数を見つけ出し、それらの積を計算するのが本記事のテーマです。素数とは、1とその数自身でしか割り切れない正の整数のことです。たとえば、2、3、5、7、11などが素数に該当します。それでは、次の配列を例に解を求めてみましょう。入力: arr[] = { 11, 20, 31, 4, 5, 6, 70 }出力: 1705説明: 配列内の素数は 11、31、5 の3つであり、その積は 11 × 31 × 5 = 1705 となります。入力: arr[] = { 1, 2, 3, 4, 5, 6, 7 }出力: 210説明: 配列内の