# Check if an integer can be expressed as a sum of two semi-primes

Given a positive integer N, check if it can be expressed as a sum of two semi-primes or not.

Semi-primes A number is said to be a semi-prime if it can be expressed as product of two primes number ( not necessarily distinct ).

Semi-primes in the range 1 -100 are:

4, 6, 9, 10, 14, 15, 21, 22, 25, 26, 33, 34, 35, 38, 39, 46, 49, 51, 55, 57, 58, 62, 65, 69, 74, 77, 82, 85, 86, 87, 91, 93, 94, 95.

Examples:

```Input : N = 30
Output: YES
Explanation: 30 can be expressed as '15 + 15'
15 is semi-primes as 15 is a product of two primes 3 and 5.

Input : N = 45
Output : YES
Explanation: 45 can be expressed as '35 + 10'
35 and 10 are also  semi-primes as it can a be expressed
as product of two primes:
35 = 5 * 7
10 = 2 * 5
```

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

Prerequisite:

A Simple Solution is to traverse form i=1 to and check if i and N-i are semi-primes or not. If yes, print i and n-i.

An Efficient Solution is to pre-compute semi-primes in an array up to the given range and then traverse the semi-prime array and check if n-arr[i] is semi-prime or not. As, arr[i] is already a semi-prime if n-arr[i] is also a semi-prime, then n can be expressed as sum of two semi-primes.

Below is the implementation of above approach:

## C++

 `// CPP Code to check if an integer ` `// can be expressed as sum of ` `// two semi-primes ` ` `  `#include ` `using` `namespace` `std; ` `#define MAX 1000000 ` ` `  `vector<``int``> arr; ` `bool` `sprime[MAX]; ` ` `  `// Utility function to compute ` `// semi-primes in a range ` `void` `computeSemiPrime() ` `{ ` `    ``memset``(sprime, ``false``, ``sizeof``(sprime)); ` ` `  `    ``for` `(``int` `i = 2; i < MAX; i++) { ` ` `  `        ``int` `cnt = 0; ` `        ``int` `num = i; ` `        ``for` `(``int` `j = 2; cnt < 2 && j * j <= num; ++j) { ` `            ``while` `(num % j == 0) { ` `                ``num /= j, ++cnt; ``// Increment count ` `                ``// of prime numbers ` `            ``} ` `        ``} ` ` `  `        ``// If number is greater than 1, add it to ` `        ``// the count variable as it indicates the ` `        ``// number remain is prime number ` ` `  `        ``if` `(num > 1) ` `            ``++cnt; ` ` `  `        ``// if count is equal to '2' then ` `        ``// number is semi-prime ` ` `  `        ``if` `(cnt == 2) { ` ` `  `            ``sprime[i] = ``true``; ` `            ``arr.push_back(i); ` `        ``} ` `    ``} ` `} ` ` `  `// Utility function to check ` `// if a number sum of two ` `// semi-primes ` `bool` `checkSemiPrime(``int` `n) ` `{ ` `    ``int` `i = 0; ` ` `  `    ``while` `(arr[i] <= n / 2) { ` ` `  `        ``// arr[i] is already a semi-prime ` `        ``// if n-arr[i] is also a semi-prime ` `        ``// then we a number can be expressed as ` `        ``// sum of two semi-primes ` ` `  `        ``if` `(sprime[n - arr[i]]) { ` `            ``return` `true``; ` `        ``} ` ` `  `        ``i++; ` `    ``} ` ` `  `    ``return` `false``; ` `} ` ` `  `// Driver code ` `int` `main() ` `{ ` `    ``computeSemiPrime(); ` ` `  `    ``int` `n = 30; ` `    ``if` `(checkSemiPrime(n)) ` `        ``cout << ``"YES"``; ` `    ``else` `        ``cout << ``"NO"``; ` ` `  `    ``return` `0; ` `} `

## Java

 `// Java Code to check if an integer ` `// can be expressed as sum of ` `// two semi-primes ` ` `  `import` `java.util.*; ` ` `  `class` `GFG { ` ` `  `    ``static` `final` `int` `MAX = ``1000000``; ` `    ``static` `Vector arr = ``new` `Vector<>(); ` `    ``static` `boolean``[] sprime = ``new` `boolean``[MAX]; ` ` `  `    ``// Utility function to compute ` `    ``// semi-primes in a range ` `    ``static` `void` `computeSemiPrime() ` `    ``{ ` ` `  `        ``for` `(``int` `i = ``0``; i < MAX; i++) ` `            ``sprime[i] = ``false``; ` ` `  `        ``for` `(``int` `i = ``2``; i < MAX; i++) { ` ` `  `            ``int` `cnt = ``0``; ` `            ``int` `num = i; ` `            ``for` `(``int` `j = ``2``; cnt < ``2` `&& j * j <= num; ++j) { ` `                ``while` `(num % j == ``0``) { ` `                    ``num /= j; ` `                    ``++cnt; ` `                    ``// Increment count ` `                    ``// of prime numbers ` `                ``} ` `            ``} ` ` `  `            ``// If number is greater than 1, add it to ` `            ``// the count variable as it indicates the ` `            ``// number remain is prime number ` ` `  `            ``if` `(num > ``1``) ` `                ``++cnt; ` ` `  `            ``// if count is equal to '2' then ` `            ``// number is semi-prime ` ` `  `            ``if` `(cnt == ``2``) { ` ` `  `                ``sprime[i] = ``true``; ` `                ``arr.add(i); ` `            ``} ` `        ``} ` `    ``} ` ` `  `    ``// Utility function to check ` `    ``// if a number is sum of two ` `    ``// semi-primes ` `    ``static` `boolean` `checkSemiPrime(``int` `n) ` `    ``{ ` `        ``int` `i = ``0``; ` ` `  `        ``while` `(arr.get(i) <= n / ``2``) { ` ` `  `            ``// arr[i] is already a semi-prime ` `            ``// if n-arr[i] is also a semi-prime ` `            ``// then  a number can be expressed as ` `            ``// sum of two semi-primes ` ` `  `            ``if` `(sprime[n - arr.get(i)]) { ` `                ``return` `true``; ` `            ``} ` ` `  `            ``i++; ` `        ``} ` ` `  `        ``return` `false``; ` `    ``} ` ` `  `    ``// Driver code ` `    ``public` `static` `void` `main(String[] args) ` `    ``{ ` `        ``computeSemiPrime(); ` ` `  `        ``int` `n = ``30``; ` `        ``if` `(checkSemiPrime(n)) ` `            ``System.out.println(``"YES"``); ` `        ``else` `            ``System.out.println(``"NO"``); ` `    ``} ` `} `

## Python3

 `# Python3 Code to check if an integer can  ` `# be expressed as sum of two semi-primes  ` `MAX` `=` `10000` ` `  `arr ``=` `[]  ` `sprime ``=` `[``False``] ``*` `(``MAX``)  ` ` `  `# Utility function to compute  ` `# semi-primes in a range  ` `def` `computeSemiPrime(): ` ` `  `    ``for` `i ``in` `range``(``2``, ``MAX``):  ` ` `  `        ``cnt, num, j ``=` `0``, i, ``2` `        ``while` `cnt < ``2` `and` `j ``*` `j <``=` `num:  ` `            ``while` `num ``%` `j ``=``=` `0``:  ` `                ``num ``/``=` `j  ` `                 `  `                ``# Increment count of prime numbers ` `                ``cnt ``+``=` `1` `                 `  `            ``j ``+``=` `1` ` `  `        ``# If number is greater than 1, add it  ` `        ``# to the count variable as it indicates  ` `        ``# the number remain is prime number  ` `        ``if` `num > ``1``: ` `            ``cnt ``+``=` `1` ` `  `        ``# if count is equal to '2' then  ` `        ``# number is semi-prime  ` `        ``if` `cnt ``=``=` `2``: ` ` `  `            ``sprime[i] ``=` `True` `            ``arr.append(i)  ` ` `  `# Utility function to check  ` `# if a number sum of two  ` `# semi-primes  ` `def` `checkSemiPrime(n):  ` ` `  `    ``i ``=` `0` `    ``while` `arr[i] <``=` `n ``/``/` `2``: ` ` `  `        ``# arr[i] is already a semi-prime  ` `        ``# if n-arr[i] is also a semi-prime  ` `        ``# then a number can be expressed as  ` `        ``# sum of two semi-primes  ` `        ``if` `sprime[n ``-` `arr[i]] ``=``=` `True``: ` `            ``return` `True` ` `  `        ``i ``+``=` `1` `     `  `    ``return` `False` ` `  `# Driver code  ` `if` `__name__ ``=``=` `"__main__"``:  ` ` `  `    ``computeSemiPrime()  ` ` `  `    ``n ``=` `30` `    ``if` `checkSemiPrime(n) ``=``=` `True``:  ` `        ``print``(``"YES"``)  ` `    ``else``: ` `        ``print``(``"NO"``) ` ` `  `# This code is contributed by  ` `# Rituraj Jain `

## C#

 `// C# Code to check if an integer ` `// can be expressed as sum of ` `// two semi-primes ` `using` `System.Collections.Generic; ` ` `  `class` `GFG  ` `{ ` ` `  `static` `int` `MAX = 1000000; ` `static` `List<``int``> arr = ``new` `List<``int``>(); ` `static` `bool``[] sprime = ``new` `bool``[MAX]; ` ` `  `// Utility function to compute ` `// semi-primes in a range ` `static` `void` `computeSemiPrime() ` `{ ` ` `  `    ``for` `(``int` `i = 0; i < MAX; i++) ` `        ``sprime[i] = ``false``; ` ` `  `    ``for` `(``int` `i = 2; i < MAX; i++)  ` `    ``{ ` ` `  `        ``int` `cnt = 0; ` `        ``int` `num = i; ` `        ``for` `(``int` `j = 2; cnt < 2 && j * j <= num; ++j) ` `        ``{ ` `            ``while` `(num % j == 0)  ` `            ``{ ` `                ``num /= j; ` `                ``++cnt; ` `                 `  `                ``// Increment count ` `                ``// of prime numbers ` `            ``} ` `        ``} ` ` `  `        ``// If number is greater than 1, add it to ` `        ``// the count variable as it indicates the ` `        ``// number remain is prime number ` `        ``if` `(num > 1) ` `            ``++cnt; ` ` `  `        ``// if count is equal to '2' then ` `        ``// number is semi-prime ` ` `  `        ``if` `(cnt == 2)  ` `        ``{ ` `            ``sprime[i] = ``true``; ` `            ``arr.Add(i); ` `        ``} ` `    ``} ` `} ` ` `  `// Utility function to check ` `// if a number is sum of two ` `// semi-primes ` `static` `bool` `checkSemiPrime(``int` `n) ` `{ ` `    ``int` `i = 0; ` ` `  `    ``while` `(arr[i] <= n / 2)  ` `    ``{ ` ` `  `        ``// arr[i] is already a semi-prime ` `        ``// if n-arr[i] is also a semi-prime ` `        ``// then a number can be expressed as ` `        ``// sum of two semi-primes ` ` `  `        ``if` `(sprime[n - arr[i]])  ` `        ``{ ` `            ``return` `true``; ` `        ``} ` ` `  `        ``i++; ` `    ``} ` ` `  `    ``return` `false``; ` `} ` ` `  `// Driver code ` `public` `static` `void` `Main() ` `{ ` `    ``computeSemiPrime(); ` ` `  `    ``int` `n = 30; ` `    ``if` `(checkSemiPrime(n)) ` `        ``System.Console.WriteLine(``"YES"``); ` `    ``else` `        ``System.Console.WriteLine(``"NO"``); ` `} ` `} ` ` `  `// This code is contributed by mits `

Output:

```YES
``` 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.