# C++ Largest Subset with Sum of Every Pair as Prime

To find the largest subset from the given array in which the sum of every pair is a prime number. Assuming maximum element is 100000, for example −

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.

## Approach to Find the Solution

To find whether the pair is prime first, we need to check if its sum is odd or even because even numbers are not prime except 2. And the sum of two numbers can be even if both the numbers are either odd or even.

In this problem, we will take three numbers, x, y, and z, where any two numbers should be even or odd. Then we will check this subset for prime sum pairs, and this could be possible if,

• Subset contains some numbers of 1’s and some other numbers in which NUM + 1 should be prime.

• Or if the subset contains only two numbers whose sum is prime.

## Example

 #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;
}

## Output

3
1 1 2

## Explanation of the Above Code

• Firstly we are checking the number of ones in the array.

• If it is more than 0, then traverse through the array and check each element other than one whether nums[i] + 1 is prime; if yes, then print the total number of (ones + 1) as the size of the subset and all the ones with the number.

• If the given array contains only ones, print all the ones as the sum of all the pairs will be 2(prime).

• If no one is present, then check every pair in the array with sum prime.

• Else print -1.

## Conclusion

In this tutorial, we discussed a problem where we need to find the largest subset from the given array in which the sum of each pair is prime. We discussed an approach to solve this problem with the help of the sieve of Eratosthenes and to check the number of ones in the array. We also discussed the C++ program for this problem which we can do with programming languages like C, Java, Python, etc. We hope you find this tutorial helpful.

Updated on: 25-Nov-2021

90 Views