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   
Prerequisite: 
 
A Simple Solution is to traverse from 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 <bits/stdc++.h>using namespace std;#define MAX 1000000vector<int> arr;bool sprime[MAX];// Utility function to compute// semi-primes in a rangevoid 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-primesbool 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 codeint 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-primesimport java.util.*;class GFG {    static final int MAX = 1000000;    static Vector<Integer> 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 = 10000arr = [] 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-primesusing 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 rangestatic 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-primesstatic 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 codepublic 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 | 
Javascript
<script>// Javascript Code to check if an integer// can be expressed as sum of// two semi-primesvar MAX = 1000000;var arr = [];var sprime = Array(MAX).fill(false);// Utility function to compute// semi-primes in a rangefunction computeSemiPrime(){    for (var i = 2; i < MAX; i++) {        var cnt = 0;        var num = i;        for (var 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(i);        }    }}// Utility function to check// if a number sum of two// semi-primesfunction checkSemiPrime(n){    var i = 0;    while (arr[i] <= parseInt(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 codecomputeSemiPrime();var n = 30;if (checkSemiPrime(n))    document.write( "YES");else    document.write( "NO");// This code is contributed by itsok.</script> | 
YES
Time Complexity: O(MAX*log(log(MAX)))
Auxiliary Space: O(MAX)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
