K-Primes (Numbers with k prime factors) in a range
Last Updated :
23 Jun, 2022
Given three integers A, B and K. We need to find no. of K-prime numbers in the range [A, B]. A number is called K-prime if it has exactly K distinct prime factors.
Examples:
Input : A = 4, B = 10, K = 2.
Output : 6 10
Given range is [4, 5, 6, 7, 8, 9, 10].
From the above range 6 and 10 have 2 distinct
prime factors, 6 = 3*2; 10 = 5*2.
Input : A = 14, B = 18, K = 2.
Output : 14 15 18
Range = [14, 15].
Both 14, 15 and 18 have 2 distinct prime factors,
14 = 7*2, 15 = 3*5 and 18 = 2*3*3
A simple solution is to traverse through given range. For every element of the range, find its prime factors. Finally print all those numbers whose prime factors are k.
An efficient solution is to use Sieve Of Eratosthenes Algorithm
prime[n] = {true};
for (int p=2; p*p<=n; p++)
{
// If prime[p] is not changed, then
// it is a prime
if (prime[p] == true)
{
// Update all multiples of p
for (int i=p*2; i<=n; i += p)
prime[i] = false;
}
}
If we observe the above algorithm clearly it has a property of iterating through all the multiples of prime numbers less than N. So the number of times the algorithm marks a number not prime is equal to the number of prime factors of that number. To achieve this, maintain an array called marked and increase the count of a number every time when it is marked as not prime by the algorithm. And in the next step, we iterate through all the numbers in the range [A, B] and increase our count of k-prime numbers if marked[number] == K.
C++
#include <bits/stdc++.h>
using namespace std;
void printKPFNums( int A, int B, int K)
{
bool prime[B+1] = { true };
int p_factors[B+1] = { 0 };
for ( int p = 2; p <= B; p++)
if (p_factors[p] == 0)
for ( int i = p; i <= B; i += p)
p_factors[i]++;
for ( int i = A; i <= B; i++)
if (p_factors[i] == K)
cout << i << " " ;
}
int main()
{
int A = 14, B = 18, K = 2;
printKPFNums(A, B, K);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG {
static void printKPFNums( int A, int B, int K)
{
int p_factors[] = new int [B+ 1 ];
Arrays.fill(p_factors, 0 );
for ( int p = 2 ; p <= B; p++)
if (p_factors[p] == 0 )
for ( int i = p; i <= B; i += p)
p_factors[i]++;
for ( int i = A; i <= B; i++)
if (p_factors[i] == K)
System.out.print( i + " " );
}
public static void main(String args[])
{
int A = 14 , B = 18 , K = 2 ;
printKPFNums(A, B, K);
}
}
|
Python3
def printKPFNums(A, B, K) :
prime = [ True ] * (B + 1 )
p_factors = [ 0 ] * (B + 1 )
for p in range ( 2 ,B + 1 ) :
if (p_factors[p] = = 0 ) :
for i in range (p,B + 1 ,p) :
p_factors[i] = p_factors[i] + 1
for i in range (A,B + 1 ) :
if (p_factors[i] = = K) :
print ( i ,end = " " )
A = 14
B = 18
K = 2
printKPFNums(A, B, K)
|
C#
using System;
class GFG {
static void printKPFNums( int A, int B,
int K)
{
bool []prime = new bool [B + 1];
for ( int i = 0; i < B + 1; i++)
prime[i] = true ;
int []p_factors = new int [B + 1];
for ( int i = 0; i < B + 1; i++)
p_factors[i] = 0;
for ( int p = 2; p <= B; p++)
if (p_factors[p] == 0)
for ( int i = p; i <= B; i += p)
p_factors[i]++;
for ( int i = A; i <= B; i++)
if (p_factors[i] == K)
Console.Write( i + " " );
}
public static void Main()
{
int A = 14, B = 18, K = 2;
printKPFNums(A, B, K);
}
}
|
PHP
<?php
function printKPFNums( $A , $B , $K )
{
$prime = array_fill (true, $B + 1, NULL);
$p_factors = array_fill (0, $B + 1, NULL);
for ( $p = 2; $p <= $B ; $p ++)
if ( $p_factors [ $p ] == 0)
for ( $i = $p ; $i <= $B ; $i += $p )
$p_factors [ $i ]++;
for ( $i = $A ; $i <= $B ; $i ++)
if ( $p_factors [ $i ] == $K )
echo $i . " " ;
}
$A = 14;
$B = 18;
$K = 2;
printKPFNums( $A , $B , $K );
?>
|
Javascript
<script>
function prletKPFNums(A, B, K)
{
let prime = [];
for (let i = 0; i < B + 1; i++)
prime[i] = true ;
let p_factors = [];
for (let i = 0; i < B + 1; i++)
p_factors[i] = 0;
for (let p = 2; p <= B; p++)
if (p_factors[p] == 0)
for (let i = p; i <= B; i += p)
p_factors[i]++;
for (let i = A; i <= B; i++)
if (p_factors[i] == K)
document.write( i + " " );
}
let A = 14, B = 18, K = 2;
prletKPFNums(A, B, K);
</script>
|
Output:
14 15 18
Time Complexity: O(B2) , B is the range
Auxiliary Space: O(B), B is the range
Please suggest if someone has a better solution which is more efficient in terms of space and time.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...