# Print all Semi-Prime Numbers less than or equal to N

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 DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

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.

Article Tags :

3

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.