Prime numbers after prime P with sum S

Given three numbers sum S, prime P and N, find all N prime numbers after prime P such that their sum is equal to S.

Examples :

Input :  N = 2, P = 7, S = 28
Output : 11 17
Explanation : 11 and 17 are primes after
prime 7 and (11 + 17 = 28)

Input :  N = 3, P = 2, S = 23
Output : 3 7 13
5 7 11
Explanation : 3, 5, 7, 11 and 13 are primes
after prime 2. And (3 + 7 + 13 = 5 + 7 + 11
= 23)

Input :  N = 4, P = 3, S = 54
Output : 5 7 11 31
5 7 13 29
5 7 19 23
5 13 17 19
7 11 13 23
7 11 17 19
Explanation : All are prime numbers and
their sum is 54

Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach : The approach used is to produce all the primes less than S and greater than P. And then backtracking to find if such N primes exist whose sum equals S.

For example, S = 10, N = 2, P = 2 C++

 // CPP Program to print all N primes after // prime P whose sum equals S #include #include #include using namespace std;    // vector to store prime and N primes // whose sum equals given S vector set; vector prime;    // function to check prime number bool isPrime(int x) {     // square root of x     int sqroot = sqrt(x);     bool flag = true;        // since 1 is not prime number     if (x == 1)         return false;        // if any factor is found return false     for (int i = 2; i <= sqroot; i++)         if (x % i == 0)             return false;        // no factor found     return true; }    // function to display N primes whose sum equals S void display() {     int length = set.size();     for (int i = 0; i < length; i++)         cout << set[i] << " ";     cout << "\n"; }    // function to evaluate all possible N primes // whose sum equals S void primeSum(int total, int N, int S, int index) {     // if total equals S And     // total is reached using N primes     if (total == S && set.size() == N)     {         // display the N primes         display();         return;     }        // if total is greater than S     // or if index has reached last element     if (total > S || index == prime.size())         return;        // add prime[index] to set vector     set.push_back(prime[index]);        // include the (index)th prime to total     primeSum(total+prime[index], N, S, index+1);        // remove element from set vector     set.pop_back();        // exclude (index)th prime     primeSum(total, N, S, index+1); }    // function to generate all primes void allPrime(int N, int S, int P) {     // all primes less than S itself     for (int i = P+1; i <=S ; i++)     {         // if i is prime add it to prime vector         if (isPrime(i))             prime.push_back(i);     }        // if primes are less than N     if (prime.size() < N)         return;     primeSum(0, N, S, 0); }    // Driver Code int main() {     int S = 54, N = 2, P = 3;     allPrime(N, S, P);     return 0; }

Java

 // Java Program to print  // all N primes after prime  // P whose sum equals S import java.io.*; import java.util.*;    class GFG {     // vector to store prime      // and N primes whose sum     // equals given S     static ArrayList set =                       new ArrayList();     static ArrayList prime =                       new ArrayList();            // function to check     // prime number     static boolean isPrime(int x)     {         // square root of x         int sqroot = (int)Math.sqrt(x);            // since 1 is not         // prime number         if (x == 1)             return false;                // if any factor is         // found return false         for (int i = 2;                   i <= sqroot; i++)             if (x % i == 0)                 return false;                // no factor found         return true;     }            // function to display N      // primes whose sum equals S     static void display()     {         int length = set.size();         for (int i = 0;                   i < length; i++)             System.out.print(                    set.get(i) + " ");         System.out.println();     }            // function to evaluate      // all possible N primes     // whose sum equals S     static void primeSum(int total, int N,                           int S, int index)     {         // if total equals S         // And total is reached         // using N primes         if (total == S &&              set.size() == N)         {             // display the N primes             display();             return;         }                // if total is greater          // than S or if index          // has reached last         // element         if (total > S ||             index == prime.size())             return;                // add prime.get(index)          // to set vector         set.add(prime.get(index));                // include the (index)th          // prime to total         primeSum(total + prime.get(index),                          N, S, index + 1);                // remove element          // from set vector         set.remove(set.size() - 1);                // exclude (index)th prime         primeSum(total, N,                   S, index + 1);     }            // function to generate     // all primes     static void allPrime(int N,                           int S, int P)     {         // all primes less          // than S itself         for (int i = P + 1;                   i <= S ; i++)         {             // if i is prime add             // it to prime vector             if (isPrime(i))                 prime.add(i);         }                // if primes are          // less than N         if (prime.size() < N)             return;         primeSum(0, N, S, 0);     }            // Driver Code     public static void main(String args[])     {         int S = 54, N = 2, P = 3;         allPrime(N, S, P);     } }    // This code is contributed by  // Manish Shaw(manishshaw1)

Python3

 # Python Program to print # all N primes after prime  # P whose sum equals S import math    # vector to store prime  # and N primes whose  # sum equals given S set = [] prime = []    # function to  # check prime number def isPrime(x) :        # square root of x     sqroot = int(math.sqrt(x))     flag = True        # since 1 is not     # prime number     if (x == 1) :         return False        # if any factor is     # found return false     for i in range(2, sqroot + 1) :         if (x % i == 0) :             return False        # no factor found     return True    # function to display N  # primes whose sum equals S def display() :        global set, prime     length = len(set)     for i in range(0, length) :         print (set[i], end = " ")     print ()    # function to evaluate  # all possible N primes # whose sum equals S def primeSum(total, N,               S, index) :            global set, prime            # if total equals S      # And total is reached      # using N primes     if (total == S and           len(set) == N) :                # display the N primes         display()         return        # if total is greater      # than S or if index      # has reached last element     if (total > S or          index == len(prime)) :         return        # add prime[index]     # to set vector     set.append(prime[index])        # include the (index)th     # prime to total     primeSum(total + prime[index],                    N, S, index + 1)        # remove element     # from set vector     set.pop()        # exclude (index)th prime     primeSum(total, N,               S, index + 1)    # function to generate # all primes def allPrime(N, S, P) :        global set, prime            # all primes less      # than S itself     for i in range(P + 1,                     S + 1) :                # if i is prime add         # it to prime vector         if (isPrime(i)) :             prime.append(i)            # if primes are     # less than N     if (len(prime) < N) :         return     primeSum(0, N, S, 0)    # Driver Code S = 54 N = 2 P = 3 allPrime(N, S, P)    # This code is contributed by # Manish Shaw(manishshaw1)

C#

 // C# Program to print all  // N primes after prime P  // whose sum equals S using System; using System.Collections.Generic;    class GFG {     // vector to store prime      // and N primes whose sum     // equals given S     static List set = new List();     static List prime = new List();            // function to check prime number     static bool isPrime(int x)     {         // square root of x         int sqroot = (int)Math.Sqrt(x);            // since 1 is not prime number         if (x == 1)             return false;                // if any factor is         // found return false         for (int i = 2; i <= sqroot; i++)             if (x % i == 0)                 return false;                // no factor found         return true;     }            // function to display N      // primes whose sum equals S     static void display()     {         int length = set.Count;         for (int i = 0; i < length; i++)             Console.Write(set[i] + " ");         Console.WriteLine();     }            // function to evaluate      // all possible N primes     // whose sum equals S     static void primeSum(int total, int N,                           int S, int index)     {         // if total equals S And         // total is reached using N primes         if (total == S && set.Count == N)         {             // display the N primes             display();             return;         }                // if total is greater than          // S or if index has reached         // last element         if (total > S || index == prime.Count)             return;                // add prime[index]          // to set vector         set.Add(prime[index]);                // include the (index)th          // prime to total         primeSum(total + prime[index],                          N, S, index + 1);                // remove element          // from set vector         set.RemoveAt(set.Count - 1);                // exclude (index)th prime         primeSum(total, N, S, index + 1);     }            // function to generate     // all primes     static void allPrime(int N,                           int S, int P)     {         // all primes less than S itself         for (int i = P + 1; i <=S ; i++)         {             // if i is prime add             // it to prime vector             if (isPrime(i))                 prime.Add(i);         }                // if primes are          // less than N         if (prime.Count < N)             return;         primeSum(0, N, S, 0);     }            // Driver Code     static void Main()     {         int S = 54, N = 2, P = 3;         allPrime(N, S, P);     } }    // This code is contributed by  // Manish Shaw(manishshaw1)

PHP

 \$S ||         \$index == count(\$prime))         return;        // add prime[index]     // to set vector     array_push(\$set,                 \$prime[\$index]);        // include the (index)th     // prime to total     primeSum(\$total + \$prime[\$index],               \$N, \$S, \$index + 1);        // remove element     // from set vector     array_pop(\$set);        // exclude (index)th prime     primeSum(\$total, \$N, \$S,               \$index + 1); }    // function to generate // all primes function allPrime(\$N, \$S, \$P) {     global \$set, \$prime;            // all primes less      // than S itself     for (\$i = \$P + 1;           \$i <= \$S ; \$i++)     {         // if i is prime add         // it to prime vector         if (isPrime(\$i))             array_push(\$prime, \$i);     }        // if primes are     // less than N     if (count(\$prime) < \$N)         return;     primeSum(0, \$N, \$S, 0); }     // Driver Code \$S = 54; \$N = 2; \$P = 3; allPrime(\$N, \$S, \$P);    // This code is contributed by // Manish Shaw(manishshaw1) ?>

Output:

7 47
11 43
13 41
17 37
23 31

Optimizations :
The above solution can be optimized by pre-computing all required primes using Sieve of Eratosthenes

My Personal Notes arrow_drop_up Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Improved By : manishshaw1

Article Tags :

1

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.