Related Articles
Print all Semi-Prime Numbers less than or equal to N
• Difficulty Level : Hard
• Last Updated : 24 Jul, 2019

Given an integer N, the task is to print all the semi-prime numbers ≤ N.

A semi-prime number is an integer which can be expressed as a product of two distinct prime numbers.
For example, 15 = 3 * 5 is a semi-prime number but 9 = 3 * 3 is not.

Examples:

Input: N = 20
Output: 6 10 14 15

Input: N = 50
Output: 6 10 14 15 21 22 26 33 34 35 38 39 46

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

Prerequisites:

Approach: For every number < N, count the number of prime factors it has. If the number of prime factors is 2 then the number is a semi-prime number as all the semi-prime numbers have only 2 prime factors.

Below is the implementation of the above approach:

## C++

 `// C++ implementation of the approach``#include ``using` `namespace` `std;`` ` `// Function to create Sieve for Semi Prime Numbers``vector<``int``> createSemiPrimeSieve(``int` `n)``{``    ``int` `v[n + 1];`` ` `    ``// This array will initially store the indexes``    ``// After performing below operations if any``    ``// element of array becomes 1 this means``    ``// that the given index is a semi-prime number`` ` `    ``// Storing indices in each element of vector``    ``for` `(``int` `i = 1; i <= n; i++)``        ``v[i] = i;`` ` `    ``int` `countDivision[n + 1];`` ` `    ``for` `(``int` `i = 0; i < n + 1; i++)``        ``countDivision[i] = 2;`` ` `    ``// This array will initially be initialized by 2 and``    ``// will just count the divisions of a number``    ``// As a semiprime number has only 2 prime factors``    ``// which means after dividing by the 2 prime numbers``    ``// if the index countDivision[x] = 0 and v[x] = 1``    ``// this means that x is a semiprime number`` ` `    ``// If number a is prime then its``    ``// countDivision[a] = 2 and v[a] = a`` ` `    ``for` `(``int` `i = 2; i <= n; i++) {`` ` `        ``// If v[i] != i this means that it is``        ``// not a prime number as it contains``        ``// a divisor which has already divided it``        ``// same reason if countDivision[i] != 2`` ` `        ``if` `(v[i] == i && countDivision[i] == 2) {`` ` `            ``// j goes for each factor of i``            ``for` `(``int` `j = 2 * i; j <= n; j += i) {``                ``if` `(countDivision[j] > 0) {`` ` `                    ``// Dividing the number by i``                    ``// and storing the dividend``                    ``v[j] = v[j] / i;`` ` `                    ``// Decreasing the countDivision``                    ``countDivision[j]--;``                ``}``            ``}``        ``}``    ``}`` ` `    ``// A new vector to store all Semi Primes``    ``vector<``int``> res;`` ` `    ``for` `(``int` `i = 2; i <= n; i++) {`` ` `        ``// If a number becomes one and``        ``// its countDivision becomes 0``        ``// it means the number has``        ``// two prime divisors``        ``if` `(v[i] == 1 && countDivision[i] == 0)``            ``res.push_back(i);``    ``}`` ` `    ``return` `res;``}`` ` `// Driver code``int` `main()``{``    ``int` `n = 16;``    ``vector<``int``> semiPrime = createSemiPrimeSieve(n);`` ` `    ``// Print all semi-primes``    ``for` `(``int` `i = 0; i < semiPrime.size(); i++)``        ``cout << semiPrime[i] << ``" "``;`` ` `    ``return` `0;``}`

## Java

 `import` `java.util.*;`` ` `// Java implementation of the approach``class` `GFG ``{`` ` `    ``// Function to create Sieve for Semi Prime Numbers``    ``static` `Vector createSemiPrimeSieve(``int` `n) ``    ``{``        ``int` `v[] = ``new` `int``[n + ``1``];`` ` `        ``// This array will initially store the indexes``        ``// After performing below operations if any``        ``// element of array becomes 1 this means``        ``// that the given index is a semi-prime number``        ``// Storing indices in each element of vector``        ``for` `(``int` `i = ``1``; i <= n; i++)``        ``{``            ``v[i] = i;``        ``}`` ` `        ``int` `countDivision[] = ``new` `int``[n + ``1``];`` ` `        ``for` `(``int` `i = ``0``; i < n + ``1``; i++) ``        ``{``            ``countDivision[i] = ``2``;``        ``}`` ` `        ``// This array will initially be initialized by 2 and``        ``// will just count the divisions of a number``        ``// As a semiprime number has only 2 prime factors``        ``// which means after dividing by the 2 prime numbers``        ``// if the index countDivision[x] = 0 and v[x] = 1``        ``// this means that x is a semiprime number``        ``// If number a is prime then its``        ``// countDivision[a] = 2 and v[a] = a``        ``for` `(``int` `i = ``2``; i <= n; i++) ``        ``{`` ` `            ``// If v[i] != i this means that it is``            ``// not a prime number as it contains``            ``// a divisor which has already divided it``            ``// same reason if countDivision[i] != 2``            ``if` `(v[i] == i && countDivision[i] == ``2``)``            ``{`` ` `                ``// j goes for each factor of i``                ``for` `(``int` `j = ``2` `* i; j <= n; j += i) ``                ``{``                    ``if` `(countDivision[j] > ``0``) ``                    ``{`` ` `                        ``// Dividing the number by i``                        ``// and storing the dividend``                        ``v[j] = v[j] / i;`` ` `                        ``// Decreasing the countDivision``                        ``countDivision[j]--;``                    ``}``                ``}``            ``}``        ``}`` ` `        ``// A new vector to store all Semi Primes``        ``Vector res = ``new` `Vector<>();`` ` `        ``for` `(``int` `i = ``2``; i <= n; i++) ``        ``{`` ` `            ``// If a number becomes one and``            ``// its countDivision becomes 0``            ``// it means the number has``            ``// two prime divisors``            ``if` `(v[i] == ``1` `&& countDivision[i] == ``0``) {``                ``res.add(i);``            ``}``        ``}`` ` `        ``return` `res;``    ``}`` ` `    ``// Driver code``    ``public` `static` `void` `main(String[] args) ``    ``{``        ``int` `n = ``16``;``        ``Vector semiPrime = createSemiPrimeSieve(n);`` ` `        ``// Print all semi-primes``        ``for` `(``int` `i = ``0``; i < semiPrime.size(); i++) ``        ``{``            ``System.out.print(semiPrime.get(i) + ``" "``);``        ``}``    ``}``}`` ` `/* This code contributed by PrinciRaj1992 */`

## Python3

 `# Python 3 implementation of the approach`` ` `# Function to create Sieve for Semi Prime Numbers``def` `createSemiPrimeSieve(n):``    ``v ``=` `[``0` `for` `i ``in` `range``(n ``+` `1``)]`` ` `    ``# This array will initially store the indexes``    ``# After performing below operations if any``    ``# element of array becomes 1 this means``    ``# that the given index is a semi-prime number`` ` `    ``# Storing indices in each element of vector``    ``for` `i ``in` `range``(``1``, n ``+` `1``):``        ``v[i] ``=` `i`` ` `    ``countDivision ``=` `[``0` `for` `i ``in` `range``(n ``+` `1``)]`` ` `    ``for` `i ``in` `range``(n ``+` `1``):``        ``countDivision[i] ``=` `2`` ` `    ``# This array will initially be initialized by 2 and``    ``# will just count the divisions of a number``    ``# As a semiprime number has only 2 prime factors``    ``# which means after dividing by the 2 prime numbers``    ``# if the index countDivision[x] = 0 and v[x] = 1``    ``# this means that x is a semiprime number`` ` `    ``# If number a is prime then its``    ``# countDivision[a] = 2 and v[a] = a`` ` `    ``for` `i ``in` `range``(``2``, n ``+` `1``, ``1``):``         ` `        ``# If v[i] != i this means that it is``        ``# not a prime number as it contains``        ``# a divisor which has already divided it``        ``# same reason if countDivision[i] != 2``        ``if` `(v[i] ``=``=` `i ``and` `countDivision[i] ``=``=` `2``):``             ` `            ``# j goes for each factor of i``            ``for` `j ``in` `range``(``2` `*` `i, n ``+` `1``, i):``                ``if` `(countDivision[j] > ``0``):``                     ` `                    ``# Dividing the number by i``                    ``# and storing the dividend``                    ``v[j] ``=` `int``(v[j] ``/` `i)`` ` `                    ``# Decreasing the countDivision``                    ``countDivision[j] ``-``=` `1``                     ` `    ``# A new vector to store all Semi Primes``    ``res ``=` `[]`` ` `    ``for` `i ``in` `range``(``2``, n ``+` `1``, ``1``):``         ` `        ``# If a number becomes one and``        ``# its countDivision becomes 0``        ``# it means the number has``        ``# two prime divisors``        ``if` `(v[i] ``=``=` `1` `and` `countDivision[i] ``=``=` `0``):``            ``res.append(i)`` ` `    ``return` `res`` ` `# Driver code``if` `__name__ ``=``=` `'__main__'``:``    ``n ``=` `16``    ``semiPrime ``=` `createSemiPrimeSieve(n)`` ` `    ``# Print all semi-primes``    ``for` `i ``in` `range``(``len``(semiPrime)):``        ``print``(semiPrime[i], end ``=` `" "``)``         ` `# This code is contributed by``# Surendra_Gangwar`

## C#

 `// C# implementation of the approach``using` `System;``using` `System.Collections;`` ` `class` `GFG``{``     ` `// Function to create Sieve for Semi Prime Numbers``static` `ArrayList createSemiPrimeSieve(``int` `n)``{``    ``int``[] v = ``new` `int``[n + 1];`` ` `    ``// This array will initially store the indexes``    ``// After performing below operations if any``    ``// element of array becomes 1 this means``    ``// that the given index is a semi-prime number`` ` `    ``// Storing indices in each element of vector``    ``for` `(``int` `i = 1; i <= n; i++)``        ``v[i] = i;`` ` `    ``int``[] countDivision = ``new` `int``[n + 1];`` ` `    ``for` `(``int` `i = 0; i < n + 1; i++)``        ``countDivision[i] = 2;`` ` `    ``// This array will initially be initialized by 2 and``    ``// will just count the divisions of a number``    ``// As a semiprime number has only 2 prime factors``    ``// which means after dividing by the 2 prime numbers``    ``// if the index countDivision[x] = 0 and v[x] = 1``    ``// this means that x is a semiprime number`` ` `    ``// If number a is prime then its``    ``// countDivision[a] = 2 and v[a] = a`` ` `    ``for` `(``int` `i = 2; i <= n; i++) ``    ``{`` ` `        ``// If v[i] != i this means that it is``        ``// not a prime number as it contains``        ``// a divisor which has already divided it``        ``// same reason if countDivision[i] != 2`` ` `        ``if` `(v[i] == i && countDivision[i] == 2)``        ``{`` ` `            ``// j goes for each factor of i``            ``for` `(``int` `j = 2 * i; j <= n; j += i) ``            ``{``                ``if` `(countDivision[j] > 0) ``                ``{`` ` `                    ``// Dividing the number by i``                    ``// and storing the dividend``                    ``v[j] = v[j] / i;`` ` `                    ``// Decreasing the countDivision``                    ``countDivision[j]--;``                ``}``            ``}``        ``}``    ``}`` ` `    ``// A new vector to store all Semi Primes``    ``ArrayList res = ``new` `ArrayList();`` ` `    ``for` `(``int` `i = 2; i <= n; i++) ``    ``{`` ` `        ``// If a number becomes one and``        ``// its countDivision becomes 0``        ``// it means the number has``        ``// two prime divisors``        ``if` `(v[i] == 1 && countDivision[i] == 0)``            ``res.Add(i);``    ``}`` ` `    ``return` `res;``}`` ` `// Driver code``static` `void` `Main()``{``    ``int` `n = 16;``    ``ArrayList semiPrime = createSemiPrimeSieve(n);`` ` `    ``// Print all semi-primes``    ``for` `(``int` `i = 0; i < semiPrime.Count; i++)``        ``Console.Write((``int``)semiPrime[i]+``" "``);``}``}`` ` `// This code is contribued by mits`

## PHP

 ` 0) ``                ``{`` ` `                    ``// Dividing the number by i``                    ``// and storing the dividend``                    ``\$v``[``\$j``] = ``\$v``[``\$j``] / ``\$i``;`` ` `                    ``// Decreasing the countDivision``                    ``\$countDivision``[``\$j``]--;``                ``}``            ``}``        ``}``    ``}`` ` `    ``// A new vector to store all Semi Primes``    ``\$res` `= ``array``();`` ` `    ``for` `(``\$i` `= 2; ``\$i` `<= ``\$n``; ``\$i``++)``    ``{`` ` `        ``// If a number becomes one and``        ``// its countDivision becomes 0``        ``// it means the number has``        ``// two prime divisors``        ``if` `(``\$v``[``\$i``] == 1 && ``\$countDivision``[``\$i``] == 0)``            ``array_push``(``\$res``, ``\$i``);``    ``}`` ` `    ``return` `\$res``;``}`` ` `// Driver code``\$n` `= 16;``\$semiPrime``= ``array``();``\$semiPrime` `= createSemiPrimeSieve(``\$n``);`` ` `// Print all semi-primes``for` `(``\$i` `= 0; ``\$i` `< ``count``(``\$semiPrime``); ``\$i``++)``    ``echo` `\$semiPrime``[``\$i``], ``" "``;`` ` `// This code is contributed by ihritik``?>`
Output:
```6 10 14 15
```

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