k-Rough Number or k-Jagged Number
Last Updated :
29 Mar, 2024
A k-rough or k-jagged number is a number whose smallest prime factor is greater than or equal to the number ‘k’. Given numbers ‘n’ and ‘k’ as input, we are required to find whether ‘n; is a k-rough number or not.
Examples :
Input : n = 10, k = 2
Output : 10 is a 2-rough number
Explanation: The prime factors of 10 are 2 and 5 Hence its smallest prime factor is 2 which is greater than or equal to k, i.e 2
Input : n = 55, k = 7
Output : 55 is not a 7-rough number
Explanation: The prime factors of 55 are 5 and 11 Hence its smallest prime factor is 5 which is not greater than or equal to k, i.e 7
It may be inferred from above that every positive integer, except 1, is a 2-rough number since their smallest prime factor is either 2(for even positive integers) or greater than 2(for odd positive integers).
Simple Approach
- First find all prime numbers up to the number ‘n’.
- Next find the smallest prime factor of the number ‘n’ from its prime factorization.
- Check if the smallest prime factor is greater than or equal to ‘k’ or not.
C++
#include <bits/stdc++.h>
using namespace std;
vector< int > getPrimes( int n)
{
int i, j;
bool isPrime[n + 1];
memset (isPrime, true , sizeof (isPrime));
for (i = 2; i * i <= n; i++)
{
if (isPrime[i] == true )
{
for (j = i * 2; j <= n; j += i)
isPrime[j] = false ;
}
}
vector< int > primes;
for (i = 2; i <= n; i++)
if (isPrime[i])
primes.push_back(i);
return primes;
}
bool isRough( int n, int k)
{
vector< int > primes = getPrimes(n);
int min_pf = n;
for ( int i = 0; i < primes.size(); i++)
if (n % primes[i] == 0)
min_pf = primes[i];
return (min_pf >= k);
}
int main()
{
int n = 75, k = 3;
if (isRough(n, k))
cout << n << " is a "
<< k << "-rough number\n" ;
else
cout << n << " is not a "
<< k << "-rough number\n" ;
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG
{
static ArrayList<Integer> getPrimes( int n)
{
int i, j;
int []isPrime = new int [n + 1 ];
for (i = 0 ; i < n + 1 ; i++)
isPrime[i] = 1 ;
for (i = 2 ; i * i <= n; i++)
{
if (isPrime[i] == 1 )
{
for (j = i * 2 ; j <= n; j += i)
isPrime[j] = 0 ;
}
}
ArrayList<Integer> primes = new ArrayList<Integer>();
for (i = 2 ; i <= n; i++)
if (isPrime[i] == 1 )
primes.add(i);
return primes;
}
static boolean isRough( int n, int k)
{
ArrayList<Integer> primes = getPrimes(n);
int min_pf = n;
for ( int i = 0 ; i < primes.size(); i++)
if (n % primes.get(i) == 0 )
min_pf = primes.get(i);
return (min_pf >= k);
}
public static void main(String args[])
{
int n = 75 , k = 3 ;
if (isRough(n, k))
System.out.print(n + " is a " + k +
"-rough number\n" );
else
System.out.print(+ n + " is not a " +
k + "-rough number\n" );
}
}
|
Python3
def getPrimes(n):
isPrime = [ True ] * (n + 1 );
i = 2 ;
while (i * i < = n):
if (isPrime[i] = = True ):
j = i * 2 ;
while (j < = n):
isPrime[j] = False ;
j + = i;
i + = 1 ;
primes = [];
for i in range ( 2 , n + 1 ):
if (isPrime[i]):
primes.append(i);
return primes;
def isRough(n, k):
primes = getPrimes(n);
min_pf = n;
for i in range ( len (primes)):
if (n % primes[i] = = 0 ):
min_pf = primes[i];
return (min_pf > = k);
n = 75 ;
k = 3 ;
if (isRough(n, k)):
print (n, "is a" , k, "-rough number" );
else :
print (n, "is not a" , k, "-rough number" );
|
C#
using System;
using System.Collections.Generic;
using System.Linq;
class GFG {
static List< int > getPrimes( int n)
{
int i, j;
int []isPrime = new int [n + 1];
for (i = 0; i < n + 1; i++)
isPrime[i] = 1;
for (i = 2; i * i <= n; i++)
{
if (isPrime[i] == 1)
{
for (j = i * 2; j <= n; j += i)
isPrime[j] = 0;
}
}
List< int > primes = new List< int >();
for (i = 2; i <= n; i++)
if (isPrime[i] == 1)
primes.Add(i);
return primes;
}
static bool isRough( int n, int k)
{
List< int > primes = getPrimes(n);
int min_pf = n;
for ( int i = 0; i < primes.Count; i++)
if (n % primes[i] == 0)
min_pf = primes[i];
return (min_pf >= k);
}
static void Main()
{
int n = 75, k = 3;
if (isRough(n, k))
Console.Write(n + " is a " + k +
"-rough number\n" );
else
Console.Write(+ n + " is not a "
+ k + "-rough number\n" );
}
}
|
PHP
<?php
function getPrimes( $n )
{
$isPrime = array_fill (0, ( $n + 1), true);
for ( $i = 2;
$i * $i <= $n ; $i ++)
{
if ( $isPrime [ $i ] == true)
{
for ( $j = $i * 2;
$j <= $n ; $j += $i )
$isPrime [ $j ] = false;
}
}
$primes = array ();
$k = 0;
for ( $i = 2; $i <= $n ; $i ++)
if ( $isPrime [ $i ])
$primes [ $k ++]= $i ;
return $primes ;
}
function isRough( $n , $k )
{
$primes = getPrimes( $n );
$min_pf = $n ;
for ( $i = 0;
$i < count ( $primes ); $i ++)
if ( $n % $primes [ $i ] == 0)
$min_pf = $primes [ $i ];
return ( $min_pf >= $k );
}
$n = 75;
$k = 3;
if (isRough( $n , $k ))
echo $n . " is a " .
$k . "-rough number\n" ;
else
echo $n . " is not a " .
$k . "-rough number\n" ;
?>
|
Javascript
<script>
function getPrimes(n)
{
var i, j;
var isPrime = Array(n+1).fill( true );
for (i = 2; i * i <= n; i++)
{
if (isPrime[i] == true )
{
for (j = i * 2; j <= n; j += i)
isPrime[j] = false ;
}
}
var primes = [];
for (i = 2; i <= n; i++)
if (isPrime[i])
primes.push(i);
return primes;
}
function isRough(n, k)
{
var primes = getPrimes(n);
var min_pf = n;
for ( var i = 0; i < primes.length; i++)
if (n % primes[i] == 0)
min_pf = primes[i];
return (min_pf >= k);
}
var n = 75, k = 3;
if (isRough(n, k))
document.write( n + " is a "
+ k + "-rough number<br>" );
else
document.write( n + " is not a "
+ k + "-rough number<br>" );
</script>
|
Output:
75 is a 3-rough number
Time Complexity: O(?n log n)
Auxiliary Space: O(n)
Efficient Solution :
The idea is based on Efficient program to print all prime factors of a given number.
- If n is divisible by 2 (smallest prime number), then we return true if k is smaller than or equal to 2. Else we return false.
- Then we one by one try all odd numbers. As soon as we find an odd number that divides n, we compare it with k and return true if the odd number is greater than or equal to k, else false. This solution works because if a prime number does not divide n, then its multiples will also not divide.
C++
# include <bits/stdc++.h>
using namespace std;
bool isKRough( int n, int k)
{
if (n % 2 == 0)
return (k <= 2);
for ( int i = 3; i*i <= n; i = i+2)
if (n%i == 0)
return (i >= k);
return (n >= k);
}
int main()
{
int n = 75, k = 3;
if (isKRough(n, k))
cout << n << " is a "
<< k << "-rough number\n" ;
else
cout << n << " is not a "
<< k << "-rough number\n" ;
return 0;
}
|
Java
class GFG {
static boolean isKRough( int n, int k)
{
if (n % 2 == 0 )
return (k <= 2 );
for ( int i = 3 ; i*i <= n; i = i + 2 )
if (n % i == 0 )
return (i >= k);
return (n >= k);
}
public static void main(String[] args)
{
int n = 75 , k = 3 ;
if (isKRough(n, k))
System.out.println(n + " is a " +
k + "-rough number" );
else
System.out.println(n + " is not a " +
k + "-rough number" );
}
}
|
Python3
def isKRough(n, k):
if (n % 2 = = 0 ):
return (k < = 2 );
i = 3 ;
while (i * i < = n):
if (n % i = = 0 ):
return (i > = k);
i = i + 2 ;
return (n > = k);
n = 75 ;
k = 3 ;
if (isKRough(n, k)):
print (n, "is a" , k, "-rough number" );
else :
print (n, "is not a" , k, "-rough number" );
|
C#
using System;
class GFG {
static bool isKRough( int n, int k)
{
if (n % 2 == 0)
return (k <= 2);
for ( int i = 3; i*i <= n; i = i + 2)
if (n % i == 0)
return (i >= k);
return (n >= k);
}
public static void Main()
{
int n = 75, k = 3;
if (isKRough(n, k))
Console.Write(n + " is a " +
k + "-rough number\n" );
else
Console.Write(n + " is not a " +
k + "-rough number\n" );
}
}
|
PHP
<?php
function isKRough( $n , $k )
{
if ( $n % 2 == 0)
return ( $k <= 2);
for ( $i = 3; $i * $i <= $n ; $i = $i + 2)
if ( $n % $i == 0)
return ( $i >= $k );
return ( $n >= $k );
}
$n = 75;
$k = 3;
if (isKRough( $n , $k ))
echo $n . " is a " . $k .
"-rough number\n" ;
else
echo $n . " is not a " . $k .
"-rough number\n" ;
?>
|
Javascript
<script>
function isKRough(n, k)
{
if (n % 2 == 0)
return (k <= 2);
for (let i = 3; i * i <= n; i = i + 2)
if (n % i == 0)
return (i >= k);
return (n >= k);
}
let n = 75;
let k = 3;
if (isKRough(n, k))
document.write( n + " is a " + k + "-rough number<br>" );
else
document.write( n + " is not a " + k + "-rough number<br>" );
</script>
|
Output :
75 is a 3-rough number
Time Complexity: O(?n)
Auxiliary Space: O(1)
Please suggest if someone has a better solution which is more efficient in terms of space and time.
Share your thoughts in the comments
Please Login to comment...