Related Articles
Check if an integer can be expressed as a sum of two semi-primes
• Last Updated : 04 May, 2020

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

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up