Smallest Semi-Prime Number with at least N difference between any two of its divisors
Last Updated :
09 Jun, 2021
Given a positive integer N, the task is to find the smallest semi-prime number such that the difference between any of its two divisors is at least N.
Examples:
Input: N = 2
Output: 15
Explanation:
The divisors of 15 are 1, 3, 5, and 15 and the difference between any of its two divisors is greater than or equal to N(= 2).
Input: N = 3
Output: 55
Approach: The given problem can be solved by finding two prime numbers(say X and Y) whose difference is at least N. The idea is to find the first prime number i.e., X greater than N, and the second prime number i.e., Y greater than (N + X). Follow the steps below to solve the problem:
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
#define MAX 100001
using namespace std;
void SieveOfEratosthenes( bool prime[])
{
prime[0] = false ;
prime[1] = false ;
for ( int p = 2; p * p < MAX; p++) {
if (prime[p] == true ) {
for ( int i = p * p; i < MAX; i += p)
prime[i] = false ;
}
}
}
void smallestSemiPrime( int n)
{
bool prime[MAX];
memset (prime, true , sizeof (prime));
SieveOfEratosthenes(prime);
int num1 = n + 1;
while (prime[num1] != true ) {
num1++;
}
int num2 = num1 + n;
while (prime[num2] != true ) {
num2++;
}
cout << num1 * 1LL * num2;
}
int main()
{
int N = 2;
smallestSemiPrime(N);
return 0;
}
|
Java
class GFG{
static int MAX = 100001 ;
static void SieveOfEratosthenes( boolean prime[])
{
prime[ 0 ] = false ;
prime[ 1 ] = false ;
for ( int p = 2 ; p * p < MAX; p++)
{
if (prime[p] == true )
{
for ( int i = p * p; i < MAX; i += p)
prime[i] = false ;
}
}
}
static void smallestSemiPrime( int n)
{
boolean [] prime = new boolean [MAX];
for ( int i = 0 ; i < prime.length; i++)
{
prime[i] = true ;
}
SieveOfEratosthenes(prime);
int num1 = n + 1 ;
while (prime[num1] != true )
{
num1++;
}
int num2 = num1 + n;
while (prime[num2] != true )
{
num2++;
}
System.out.print(num1 * num2);
}
public static void main(String[] args)
{
int N = 2 ;
smallestSemiPrime(N);
}
}
|
Python3
MAX = 100001
def SieveOfEratosthenes(prime):
prime[ 0 ] = False
prime[ 1 ] = False
p = 2
while p * p < MAX :
if (prime[p] = = True ):
for i in range (p * p, MAX , p):
prime[i] = False
p + = 1
def smallestSemiPrime(n):
prime = [ True ] * MAX
SieveOfEratosthenes(prime)
num1 = n + 1
while (prime[num1] ! = True ):
num1 + = 1
num2 = num1 + n
while (prime[num2] ! = True ):
num2 + = 1
print (num1 * num2)
if __name__ = = "__main__" :
N = 2
smallestSemiPrime(N)
|
C#
using System;
class GFG{
static int MAX = 100001;
static void SieveOfEratosthenes( bool [] prime)
{
prime[0] = false ;
prime[1] = false ;
for ( int p = 2; p * p < MAX; p++)
{
if (prime[p] == true )
{
for ( int i = p * p; i < MAX; i += p)
prime[i] = false ;
}
}
}
static void smallestSemiPrime( int n)
{
bool [] prime = new bool [MAX];
for ( int i = 0; i < prime.Length; i++)
{
prime[i] = true ;
}
SieveOfEratosthenes(prime);
int num1 = n + 1;
while (prime[num1] != true )
{
num1++;
}
int num2 = num1 + n;
while (prime[num2] != true )
{
num2++;
}
Console.Write(num1 * num2);
}
static void Main()
{
int N = 2;
smallestSemiPrime(N);
}
}
|
Javascript
<script>
let MAX = 100001;
function SieveOfEratosthenes(prime)
{
prime[0] = false ;
prime[1] = false ;
for (let p = 2; p * p < MAX; p++)
{
if (prime[p] == true )
{
for (let i = p * p; i < MAX; i += p)
prime[i] = false ;
}
}
}
function smallestSemiPrime(n)
{
let prime = Array.from({length: MAX}, (_, i) => 0);
for (let i = 0; i < prime.length; i++)
{
prime[i] = true ;
}
SieveOfEratosthenes(prime);
let num1 = n + 1;
while (prime[num1] != true )
{
num1++;
}
let num2 = num1 + n;
while (prime[num2] != true )
{
num2++;
}
document.write(num1 * num2);
}
let N = 2;
smallestSemiPrime(N);
</script>
|
Time Complexity: O(M * log(log(M))), where M is the size of the prime[] array
Auxiliary Space: O(M)
Share your thoughts in the comments
Please Login to comment...