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

すべてのペアの合計を素数とするC++最大のサブセット


すべてのペアの合計が素数である、指定された配列から最大のサブセットを見つけること。最大要素が100000であると仮定すると、たとえば-

Input: nums[ ] = { 3, 2, 1,1 }
Output: size = 3, subset = { 2, 1, 1 }
Explanation:
Subsets can be formed: {3, 2}, {2, 1} and { 2, 1, 1},
In {2, 1, 1} sum of pair (2,1) is 3 which is prime,
and the sum of pairs (1,1) is 2 which is also a prime number.

Input: nums[ ] = {1, 4, 3, 2}
Output: size = 2, subset = {1, 4}
Explanation:
subset can be formed: {1, 4}, {4, 3}, and {3, 2}
All are of size 2 so we can take any subset like 1 + 4 =5 which is a prime number.

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

ペアが最初に素数であるかどうかを確認するには、2を除いて偶数が素数ではないため、その合計が奇数か偶数かを確認する必要があります。また、2つの数値の合計は、両方の数値が奇数または偶数の場合でも可能です。

この問題では、x、y、zの3つの数値を使用します。ここで、任意の2つの数値は偶数または奇数である必要があります。次に、このサブセットで素数のペアをチェックします。これは、次の場合に可能になる可能性があります。

  • サブセットには、1の数と、NUM+1が素数である他の数が含まれています。

  • または、サブセットに、合計が素数である2つの数値のみが含まれている場合。

 #include <bits/stdc++.h>
using namespace std;
#define M 100001
bool check_prime[M] = { 0 };
int sieve_of_eratosthenes(){
    for (int p = 2; p * p < M; p++){
       // If it is not marked then mark
        if (check_prime[p] == 0){
            // Update all multiples of p
            for (int i = p * 2; i < M; i += p)
                check_prime[i] = 1;
        }
    }
    return 0;
}
int main(){
    sieve_of_eratosthenes();
    int nums[] = {  3, 2, 1, 1};
    int n = sizeof(nums) / sizeof(nums[0]);
        int ones = 0;
    for (int i = 0; i < n; i++)
        if (nums[i] == 1)
            ones++;
    // If ones are present and
    // elements greater than 0 are also present
    if (ones > 0){
        for (int i = 0; i < n; i++){
            //checking whether num + 1 is prime or not
            if ((nums[i] != 1) and (check_prime[nums[i] + 1] == 0)){
                cout << ones + 1 << endl;
                // printing all the ones present with nums[i]
                for (int j = 0; j < ones; j++)
                cout << 1 << " ";
                cout << nums[i] << endl;
                return 0;
            }
        }
    }
    // If subsets contains only 1's
    if (ones >= 2){
        cout << ones << endl;
        for (int i = 0; i < ones; i++)
            cout << 1 << " ";
        cout << endl;
        return 0;
    }
    // If no ones are present.
    for (int i = 0; i < n; i++){
        for (int j = i + 1; j < n; j++){
            // searching for pair of integer having sum prime.
            if (check_prime[nums[i] + nums[j]] == 0){
                cout << 2 << endl;
                cout << nums[i] << " " << nums[j] << endl;
                return 0;
            }
        }
    }
// If only one element is present in the array.
    cout << -1 << endl;
    return 0;
}

出力

3
1 1 2

上記のコードの説明

  • まず、配列内の1の数を確認しています。

  • 0より大きい場合は、配列をトラバースし、1以外の各要素がnums [i]+1が素数であるかどうかを確認します。はいの場合は、サブセットのサイズとして(1 + 1)の総数を出力し、その数を含むすべての数を出力します。

  • 指定された配列に1つしか含まれていない場合は、すべてのペアの合計が2(prime)になるため、すべての配列を出力します。

  • 誰もいない場合は、配列内のすべてのペアを合計素数でチェックします。

  • それ以外の場合は-1を印刷します。

結論

このチュートリアルでは、各ペアの合計が素数である特定の配列から最大のサブセットを見つける必要がある問題について説明しました。エラトステネスのふるいを使ってこの問題を解決し、アレイ内の1つの数を確認する方法について説明しました。また、C、Java、Pythonなどのプログラミング言語で実行できるこの問題のC++プログラムについても説明しました。このチュートリアルがお役に立てば幸いです。


  1. C++の平衡二分探索木で与えられた合計を持つペアを見つけます

    平衡二分探索木とターゲット合計があるとすると、合計がターゲット合計に等しいペアであるかどうかをチェックするメソッドを定義する必要があります。この場合。二分探索木は不変であることに注意する必要があります。 したがって、入力が次のような場合 その場合、出力は(9 + 26 =35)になります。 これを解決するには、次の手順に従います- スタックs1、s2を定義する done1:=false、done2:=false val1:=0、val2:=0 curr1:=root、curr2:=root 無限ループ、実行- done1がfalseの場合、do − curr1が

  2. C++で指定された合計の最大サイズサブセット

    問題の説明 N個の要素と合計の配列が与えられます。合計が与えられた合計に等しい最大サイズのサブセットのサイズを見つける必要があります 例 入力配列がarr={2、3、5、10}でsum =20の場合、出力は-として4になります。 2 + 3 + 5 + 10=20これは与えられた合計に等しい アルゴリズム 動的計画法を使用してこの問題を解決できます。 最大サブセットをカウントするには、別のDP配列(「カウント配列」と呼ばれます)を使用します。ここで、count[i][j]は最大です。 count[i][j-1]。ここでは、現在の要素は考慮されていません。 scount [i-