Find n-th Fortunate Number
Last Updated :
06 Apr, 2021
A Fortunate number is the smallest integer m > 1 such that, for a given positive integer n, pn + m is a prime number. Here pn is the product of the first n prime numbers, i.e prime factorials (or primorials) of order n.
For example :
p3 = 2 × 3 × 5 = 30
p4 = 2 × 3 × 5 × 7 = 210
p5 = 2 × 3 × 5 × 7 × 11 = 2310
Now, the smallest difference m between the prime factorial pn and the first prime number greater than pn for which (m > 1), is a prime number.
Examples :
Input : n = 3
Output : 7
Explanation : 7 must be added to the product
of first n prime numbers to make the product
prime. 2 x 3 x 5 = 30, need to add 7 to make
it 37, which is a prime
Input : n = 5
Output : 23
Approach : To find the nth Fortunate number, calculate the product of the first n prime numbers (primorial). Let this product be p. Then we find prime number greater than p and return the difference between the found prime number and p.
p4 + 13 = 223, where m = 13, a fortunate number
p5 + 23 = 2333, where m = 23, a fortunate number
p6 + 17 = 30047, where m = 17, a fortunate number
C++
#include <bits/stdc++.h>
using namespace std;
bool isPrime( int n)
{
if (n <= 1) return false ;
if (n <= 3) return true ;
if (n%2 == 0 || n%3 == 0) return false ;
for ( int i=5; i*i<=n; i=i+6)
if (n%i == 0 || n%(i+2) == 0)
return false ;
return true ;
}
long long int primorial( long long int n)
{
long long int p = 2;
n--;
for ( int i = 3; n != 0; i++) {
if (isPrime(i)) {
p = p * i;
n--;
}
i++;
}
return p;
}
long long int findNextPrime( long long int n)
{
long long int nextPrime = n + 2;
while ( true ) {
if (isPrime(nextPrime))
break ;
nextPrime++;
}
return nextPrime;
}
long long int fortunateNumber( int n)
{
long long int p = primorial(n);
return findNextPrime(p) - p;
}
int main()
{
long long int n = 5;
cout << fortunateNumber(n) << "\n" ;
return 0;
}
|
Java
import java.lang.*;
import java.util.*;
class GFG
{
public static boolean isPrime( int n)
{
if (n <= 1 ) return false ;
if (n <= 3 ) return true ;
if (n % 2 == 0 || n % 3 == 0 ) return false ;
for ( int i = 5 ; i * i <= n; i = i + 6 )
if (n % i == 0 || n % (i + 2 ) == 0 )
return false ;
return true ;
}
public static int primorial( int n)
{
int p = 2 ;
n--;
for ( int i = 3 ; n != 0 ; i++) {
if (isPrime(i) == true ) {
p = p * i;
n--;
}
i++;
}
return p;
}
public static int findNextPrime( int n)
{
int nextPrime = n + 2 ;
while ( true ) {
if (isPrime(nextPrime) == true )
break ;
nextPrime++;
}
return nextPrime;
}
public static int fortunateNumber( int n)
{
int p = primorial(n);
return findNextPrime(p)-p;
}
public static void main (String[] args) {
int n = 5 ;
System.out.println(fortunateNumber(n));
}
}
|
Python3
def isPrime(n):
if (n < = 1 ): return False
if (n < = 3 ): return True
if (n % 2 = = 0 or n % 3 = = 0 ):
return False
i = 5
while (i * i < = n):
if (n % i = = 0 or
n % (i + 2 ) = = 0 ):
return False
i + = 6
return True
def primorial(n):
p = 2 ; n - = 1 ; i = 3
while (n ! = 0 ):
if (isPrime(i)):
p = p * i
n - = 1
i + = 1
return p
def findNextPrime(n):
nextPrime = n + 2
while ( True ):
if (isPrime(nextPrime)):
break
nextPrime + = 1
return nextPrime
def fortunateNumber(n):
p = primorial(n)
return findNextPrime(p) - p
n = 5
print (fortunateNumber(n))
|
C#
using System;
class GFG
{
public static bool isPrime( int n)
{
if (n <= 1) return false ;
if (n <= 3) return true ;
if (n % 2 == 0 || n % 3 == 0)
return false ;
for ( int i = 5;
i * i <= n; i = i + 6)
if (n % i == 0 ||
n % (i + 2) == 0)
return false ;
return true ;
}
public static int primorial( int n)
{
int p = 2;
n--;
for ( int i = 3; n != 0; i++)
{
if (isPrime(i) == true )
{
p = p * i;
n--;
}
i++;
}
return p;
}
public static int findNextPrime( int n)
{
int nextPrime = n + 2;
while ( true )
{
if (isPrime(nextPrime) == true )
break ;
nextPrime++;
}
return nextPrime;
}
public static int fortunateNumber( int n)
{
int p = primorial(n);
return findNextPrime(p) - p;
}
public static void Main ()
{
int n = 5;
Console.WriteLine(fortunateNumber(n));
}
}
|
PHP
<?php
function isPrime( $n )
{
if ( $n <= 1)
return false;
if ( $n <= 3)
return true;
if ( $n % 2 == 0 || $n % 3 == 0)
return false;
for ( $i = 5; $i * $i <= $n ;
$i = $i + 6)
if ( $n % $i == 0 || $n % ( $i + 2) == 0)
return false;
return true;
}
function primorial( $n )
{
$p = 2;
$n --;
for ( $i = 3; $n != 0; $i ++)
{
if (isPrime( $i ))
{
$p = $p * $i ;
$n --;
}
$i ++;
}
return $p ;
}
function findNextPrime( $n )
{
$nextPrime = $n + 2;
while (true)
{
if (isPrime( $nextPrime ))
break ;
$nextPrime ++;
}
return $nextPrime ;
}
function fortunateNumber( $n )
{
$p = primorial( $n );
return findNextPrime( $p ) - $p ;
}
$n = 5;
echo fortunateNumber( $n ) , "\n" ;
?>
|
Javascript
<script>
function isPrime(n)
{
if (n <= 1) return false ;
if (n <= 3) return true ;
if (n % 2 == 0 || n % 3 == 0) return false ;
for (let i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return false ;
return true ;
}
function primorial(n)
{
let p = 2;
n--;
for (let i = 3; n != 0; i++) {
if (isPrime(i) == true ) {
p = p * i;
n--;
}
i++;
}
return p;
}
function findNextPrime(n)
{
let nextPrime = n + 2;
while ( true ) {
if (isPrime(nextPrime) == true )
break ;
nextPrime++;
}
return nextPrime;
}
function fortunateNumber(n)
{
let p = primorial(n);
return findNextPrime(p)-p;
}
let n = 5;
document.write(fortunateNumber(n));
</script>
|
Optimization : The above solution can be optimized using Sieve of Eratosthenes.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...