Given an integer **N**, the task is to find three prime numbers **X**, **Y**, and **Z** such that the sum of these three numbers is equal to **N** i.e. **X + Y + Z = N**.

**Examples:**

Input:N = 20Output:2 5 13

Input:N = 34Output:2 3 29

**Approach:**

- Generate prime numbers using Sieve of Eratosthenes
- Start from the first prime number.
- Take another number from the generated list.
- Subtract first number and second number from the original number to obtain the third number.
- Check if the third number is a prime number.
- If the third number is a prime number then output the three numbers.
- Otherwise, repeat the process for the second number and consequently the first number
- If the answer does not exist then print
**-1**.

Below is the implementation of the above approach:

## C++

`// C++ implementation of the approach` `#include <bits/stdc++.h>` `using` `namespace` `std;` `const` `int` `MAX = 100001;` `// The vector primes holds` `// the prime numbers` `vector<` `int` `> primes;` `// Function to generate prime numbers` `void` `initialize()` `{` ` ` `// Initialize the array elements to 0s` ` ` `bool` `numbers[MAX] = {};` ` ` `int` `n = MAX;` ` ` `for` `(` `int` `i = 2; i * i <= n; i++)` ` ` `if` `(!numbers[i])` ` ` `for` `(` `int` `j = i * i; j <= n; j += i)` ` ` `// Set the non-primes to true` ` ` `numbers[j] = ` `true` `;` ` ` `// Fill the vector primes with prime` ` ` `// numbers which are marked as false` ` ` `// in the numbers array` ` ` `for` `(` `int` `i = 2; i <= n; i++)` ` ` `if` `(numbers[i] == ` `false` `)` ` ` `primes.push_back(i);` `}` `// Function to print three prime numbers` `// which sum up to the number N` `void` `findNums(` `int` `num)` `{` ` ` `bool` `ans = ` `false` `;` ` ` `int` `first = -1, second = -1, third = -1;` ` ` `for` `(` `int` `i = 0; i < num; i++) {` ` ` `// Take the first prime number` ` ` `first = primes[i];` ` ` `for` `(` `int` `j = 0; j < num; j++) {` ` ` `// Take the second prime number` ` ` `second = primes[j];` ` ` `// Subtract the two prime numbers` ` ` `// from the N to obtain the third number` ` ` `third = num - first - second;` ` ` `// If the third number is prime` ` ` `if` `(binary_search(primes.begin(),` ` ` `primes.end(), third)) {` ` ` `ans = ` `true` `;` ` ` `break` `;` ` ` `}` ` ` `}` ` ` `if` `(ans)` ` ` `break` `;` ` ` `}` ` ` `// Print the three prime numbers` ` ` `// if the solution exists` ` ` `if` `(ans)` ` ` `cout << first << ` `" "` ` ` `<< second << ` `" "` `<< third << endl;` ` ` `else` ` ` `cout << -1 << endl;` `}` `// Driver code` `int` `main()` `{` ` ` `int` `n = 101;` ` ` `// Function for generating prime numbers` ` ` `// using Sieve of Eratosthenes` ` ` `initialize();` ` ` `// Function to print the three prime` ` ` `// numbers whose sum is equal to N` ` ` `findNums(n);` ` ` `return` `0;` `}` |

## Java

`// Java implementation of the approach` `import` `java.util.*;` `import` `java.lang.*;` `import` `java.io.*;` `class` `GFG{` `static` `int` `MAX = ` `100001` `;` ` ` `// The vector primes holds` `// the prime numbers` `static` `ArrayList<Integer> primes;` ` ` `// Function to generate prime numbers` `static` `void` `initialize()` `{` ` ` ` ` `// Initialize the array elements to 0s` ` ` `boolean` `[] numbers = ` `new` `boolean` `[MAX + ` `1` `];` ` ` `int` `n = MAX;` ` ` ` ` `for` `(` `int` `i = ` `2` `; i * i <= n; i++)` ` ` `if` `(!numbers[i])` ` ` `for` `(` `int` `j = i * i; j <= n; j += i)` ` ` ` ` `// Set the non-primes to true` ` ` `numbers[j] = ` `true` `;` ` ` ` ` `// Fill the vector primes with prime` ` ` `// numbers which are marked as false` ` ` `// in the numbers array` ` ` `for` `(` `int` `i = ` `2` `; i <= n; i++)` ` ` `if` `(numbers[i] == ` `false` `)` ` ` `primes.add(i);` `}` ` ` `// Function to print three prime numbers` `// which sum up to the number N` `static` `void` `findNums(` `int` `num)` `{` ` ` `boolean` `ans = ` `false` `;` ` ` `int` `first = -` `1` `, second = -` `1` `, third = -` `1` `;` ` ` ` ` `for` `(` `int` `i = ` `0` `; i < num; i++)` ` ` `{` ` ` ` ` `// Take the first prime number` ` ` `first = primes.get(i);` ` ` ` ` `for` `(` `int` `j = ` `0` `; j < num; j++)` ` ` `{` ` ` ` ` `// Take the second prime number` ` ` `second = primes.get(j);` ` ` ` ` `// Subtract the two prime numbers` ` ` `// from the N to obtain the third number` ` ` `third = num - first - second;` ` ` ` ` `// If the third number is prime` ` ` `if` `(Collections.binarySearch(` ` ` `primes, third) >= ` `0` `)` ` ` `{` ` ` `ans = ` `true` `;` ` ` `break` `;` ` ` `}` ` ` `}` ` ` `if` `(ans)` ` ` `break` `;` ` ` `}` ` ` ` ` `// Print the three prime numbers` ` ` `// if the solution exists` ` ` `if` `(ans)` ` ` `System.out.println(first + ` `" "` `+` ` ` `second + ` `" "` `+` ` ` `third);` ` ` `else` ` ` `System.out.println(-` `1` `);` `}` `// Driver code` `public` `static` `void` `main (String[] args)` `{` ` ` `int` `n = ` `101` `;` ` ` `primes = ` `new` `ArrayList<>();` ` ` ` ` `// Function for generating prime numbers` ` ` `// using Sieve of Eratosthenes` ` ` `initialize();` ` ` ` ` `// Function to print the three prime` ` ` `// numbers whose sum is equal to N` ` ` `findNums(n);` `}` `}` `// This code is contributed by offbeat` |

## Python3

`# Python3 implementation of the approach` `from` `math ` `import` `sqrt` `MAX` `=` `100001` `;` `# The vector primes holds` `# the prime numbers` `primes ` `=` `[];` `# Function to generate prime numbers` `def` `initialize() :` ` ` `# Initialize the array elements to 0s` ` ` `numbers ` `=` `[` `0` `]` `*` `(` `MAX` `+` `1` `);` ` ` `n ` `=` `MAX` `;` ` ` `for` `i ` `in` `range` `(` `2` `, ` `int` `(sqrt(n)) ` `+` `1` `) :` ` ` `if` `(` `not` `numbers[i]) :` ` ` `for` `j ` `in` `range` `( i ` `*` `i , n ` `+` `1` `, i) :` ` ` `# Set the non-primes to true` ` ` `numbers[j] ` `=` `True` `;` ` ` `# Fill the vector primes with prime` ` ` `# numbers which are marked as false` ` ` `# in the numbers array` ` ` `for` `i ` `in` `range` `(` `2` `, n ` `+` `1` `) :` ` ` `if` `(numbers[i] ` `=` `=` `False` `) :` ` ` `primes.append(i);` `# Function to print three prime numbers` `# which sum up to the number N` `def` `findNums(num) :` ` ` `ans ` `=` `False` `;` ` ` `first ` `=` `-` `1` `;` ` ` `second ` `=` `-` `1` `;` ` ` `third ` `=` `-` `1` `;` ` ` `for` `i ` `in` `range` `(num) :` ` ` `# Take the first prime number` ` ` `first ` `=` `primes[i];` ` ` `for` `j ` `in` `range` `(num) :` ` ` `# Take the second prime number` ` ` `second ` `=` `primes[j];` ` ` `# Subtract the two prime numbers` ` ` `# from the N to obtain the third number` ` ` `third ` `=` `num ` `-` `first ` `-` `second;` ` ` `# If the third number is prime` ` ` `if` `(third ` `in` `primes) :` ` ` `ans ` `=` `True` `;` ` ` `break` `;` ` ` ` ` `if` `(ans) :` ` ` `break` `;` ` ` ` ` `# Print the three prime numbers` ` ` `# if the solution exists` ` ` `if` `(ans) :` ` ` `print` `(first , second , third);` ` ` `else` `:` ` ` `print` `(` `-` `1` `);` `# Driver code` `if` `__name__ ` `=` `=` `"__main__"` `:` ` ` `n ` `=` `101` `;` ` ` `# Function for generating prime numbers` ` ` `# using Sieve of Eratosthenes` ` ` `initialize();` ` ` `# Function to print the three prime` ` ` `# numbers whose sum is equal to N` ` ` `findNums(n);` `# This code is contributed by AnkitRai01` |

## C#

`// C# implementation of the approach` `using` `System;` `using` `System.Collections.Generic;` `class` `GFG` `{ ` ` ` `static` `int` `MAX = 100001;` ` ` `// The vector primes holds` ` ` `// the prime numbers` ` ` `static` `List<` `int` `> primes = ` `new` `List<` `int` `>();` ` ` `// Function to generate prime numbers` ` ` `static` `void` `initialize()` ` ` `{` ` ` `// Initialize the array elements to 0s` ` ` `bool` `[] numbers = ` `new` `bool` `[MAX + 1];` ` ` `int` `n = MAX;` ` ` `for` `(` `int` `i = 2; i * i <= n; i++)` ` ` `if` `(!numbers[i])` ` ` `for` `(` `int` `j = i * i; j <= n; j += i)` ` ` `// Set the non-primes to true` ` ` `numbers[j] = ` `true` `;` ` ` `// Fill the vector primes with prime` ` ` `// numbers which are marked as false` ` ` `// in the numbers array` ` ` `for` `(` `int` `i = 2; i <= n; i++)` ` ` `if` `(numbers[i] == ` `false` `)` ` ` `primes.Add(i);` ` ` `}` ` ` `// Function to print three prime numbers` ` ` `// which sum up to the number N` ` ` `static` `void` `findNums(` `int` `num)` ` ` `{` ` ` `bool` `ans = ` `false` `;` ` ` `int` `first = -1, second = -1, third = -1;` ` ` `for` `(` `int` `i = 0; i < num; i++)` ` ` `{` ` ` `// Take the first prime number` ` ` `first = primes[i];` ` ` `for` `(` `int` `j = 0; j < num; j++)` ` ` `{` ` ` `// Take the second prime number` ` ` `second = primes[j];` ` ` `// Subtract the two prime numbers` ` ` `// from the N to obtain the third number` ` ` `third = num - first - second;` ` ` `// If the third number is prime` ` ` `if` `(Array.BinarySearch(primes.ToArray(), third) >= 0)` ` ` `{` ` ` `ans = ` `true` `;` ` ` `break` `;` ` ` `}` ` ` `}` ` ` `if` `(ans)` ` ` `break` `;` ` ` `}` ` ` `// Print the three prime numbers` ` ` `// if the solution exists` ` ` `if` `(ans)` ` ` `Console.WriteLine(first + ` `" "` `+ second + ` `" "` `+ third);` ` ` `else` ` ` `Console.WriteLine(-1);` ` ` `}` ` ` `// Driver code` ` ` `static` `void` `Main()` ` ` `{` ` ` `int` `n = 101;` ` ` `// Function for generating prime numbers` ` ` `// using Sieve of Eratosthenes` ` ` `initialize();` ` ` `// Function to print the three prime` ` ` `// numbers whose sum is equal to N` ` ` `findNums(n);` ` ` `}` `}` `// This code is contributed by divyesh072019` |

**Output:**

2 2 97

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the **DSA Self Paced Course** at a student-friendly price and become industry ready. To complete your preparation from learning a language to DS Algo and many more, please refer **Complete Interview Preparation Course****.**

In case you wish to attend live classes with industry experts, please refer **Geeks Classes Live**