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

C++を使用して配列内の素数ペアの数を見つける


この記事では、C++を使用して配列内の素数ペアの数を見つける方法についてすべて説明します。整数の配列arr[]があり、そこに存在する可能性のあるすべての素数ペアを見つける必要があります。これが問題の例です-

Input : arr[ ] = { 1, 2, 3, 5, 7, 9 }

Output : 6

From the given array, prime pairs are
(2, 3), (2, 5), (2, 7), (3, 5), (3, 7), (5, 7)

Input : arr[] = {1, 4, 5, 9, 11}

Output : 1

解決策を見つけるためのアプローチ

ブルートフォースアプローチ

次に、すべての中で最も基本的なアプローチ、つまりブルートフォースのアプローチについて説明し、このアプローチはあまり効率的ではないため、別のアプローチを見つけようとします。

#include <bits/stdc++.h>
using namespace std;
void seiveOfEratosthenes(int *arr, bool *prime, int n, int MAX){
    bool p[MAX+1];
    memset(p, true, sizeof(p));
    p[1] = false;
    p[0] = false;
     for(int i = 2; i * i <= MAX; i++){
        if(p[i] == true){
            for(int j = i*2; j <= MAX; j += i){
               p[j] = false;
            }
        }
    }
    for(int i = 0; i < n; i++){
        if(p[arr[i]] == true)
           prime[i] = true;
    }
}
int main(){
    int arr[] = {1, 2, 3, 5, 7, 8, 9};
    int n = sizeof(arr) / sizeof(arr[0]); // size of our array.
    int answer = 0; // counter variable to count the number of prime pairs.
    int MAX = INT_MIN; // Max element
    for(int i = 0; i < n; i++){
       MAX = max(MAX, arr[i]);
    }
    bool prime[n]; // boolean array that tells if the element is prime or not.
    memset(prime, false, sizeof(prime)); // initializing all the elements with value of false.
    seiveOfEratosthenes(arr, prime, n, MAX);
    for(int i = 0; i < n-1; i++){
        for(int j = i+1; j < n; j++){
            if(prime[i] == true && prime[j] == true)
               answer++;
         }
    }
    cout << answer << "\n";
    return 0;
}

出力

6

このアプローチでは、要素が素数であるかどうかを示すブール配列を作成し、可能なすべてのペアを調べて、ペアの両方の数値が素数であるかどうかを確認します。素数の場合は、答えを1つ増やして、次に進みます。

ただし、このアプローチは時間計算量が O(N * N)であるため、あまり効率的ではありません。 、ここでNは配列のサイズなので、このアプローチをより高速にします。

効率的なアプローチ

このアプローチでは、ほとんどのコードは同じですが、重要な変更は、可能なすべてのペアを調べるのではなく、数式を使用してそれらを計算することです。

#include <bits/stdc++.h>
using namespace std;
void seiveOfEratosthenes(int *arr, bool *prime, int n, int MAX){
   bool p[MAX+1];
   memset(p, true, sizeof(p));
   p[1] = false;
   p[0] = false;
   for(int i = 2; i * i <= MAX; i++){
       if(p[i] == true){
           for(int j = i*2; j <= MAX; j += i){
               p[j] = false;
           }
       }
    }
    for(int i = 0; i < n; i++){
       if(p[arr[i]] == true)
           prime[i] = true;
   }
}
int main(){
   int arr[] = {1, 2, 3, 5, 7, 8, 9};
   int n = sizeof(arr) / sizeof(arr[0]); // size of our array.
   int answer = 0; // counter variable to count the number of prime pairs.
   int MAX = INT_MIN; // Max element
   for(int i = 0; i < n; i++){
       MAX = max(MAX, arr[i]);
   }
   bool prime[n]; // boolean array that tells if the element is prime or not.
   memset(prime, false, sizeof(prime)); // initializing all the elements with value of false.
   seiveOfEratosthenes(arr, prime, n, MAX);
   for(int i = 0; i < n; i++){
       if(prime[i] == true)
           answer++;
   }
   answer = (answer * (answer - 1)) / 2;
   cout << answer << "\n";
   return 0;
}

出力

6

ご覧のとおり、ほとんどのコードは前のアプローチと同じですが、複雑さを大幅に軽減した重要な変更は、使用した式、つまりn(n-1)/ 2であり、これにより、プライムペア。

上記のコードの説明

このコードでは、エラトステネスのふるいを使用して、配列にあるMax要素までのすべての素数をマークしています。別のブール配列では、要素が素数であるかどうかをインデックスごとにマークしています。

最後に、配列全体をトラバースし、存在する素数の総数を見つけ、式n *(n-1)/2を使用してすべての可能なペアを見つけます。この式を使用すると、複雑さが O(N)に減少します。 、ここで、Nは配列のサイズです。

結論

この記事では、問題を解決して、O(n)時間計算量で配列に存在する素数ペアの数を見つけます。また、この問題のC ++プログラムと、この問題を解決するための完全なアプローチ(通常および効率的)についても学びました。同じプログラムをC、Java、Python、その他の言語などの他の言語で作成できます。


  1. C++を使用して文字列の部分文字列の数を見つける

    この記事では、特定の文字列に形成できるサブ文字列(空ではない)の数を見つけるためのアプローチについて学習します。 Input : string = “moon” Output : 10 Explanation: Substrings are ‘m’, ‘o’, ‘o’, ‘n’, ‘mo’, ‘oo’, ‘on’, ‘moo’, ‘oon’ and &

  2. C++を使用して停止ステーションの数を見つける

    ポイントXとYの間にn個の中間駅があります。2つの駅が隣接しないように、s駅に停車するように列車を配置できるさまざまな方法の数を数えます。そのため、この記事では、停車駅の数を見つけるためのあらゆる可能なアプローチについて説明します。問題を見ると、sの駅数で列車を止めることができる組み合わせを見つける必要があることがわかります。 問題を解決するためのアプローチ 中間駅が8つあり、3つの中間駅で電車を止める方法を見つける必要がある例を見てみましょう。 n = 8, s = 3 (n-s)、つまり電車が止まらない駅が5つ残っています 電車が止まらないA、B、C、D、Eの5つの駅があります