Open In App

Find n-th Fortunate Number

Last Updated : 06 Apr, 2021
Improve
Improve
Like Article
Like
Save
Share
Report

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

 

Recommended Practice

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++




// C++ program to find n-th Fortunate number
#include <bits/stdc++.h>
using namespace std;
 
bool isPrime(int n)
{
    // Corner cases
    if (n <= 1)  return false;
    if (n <= 3)  return true;
  
    // This is checked so that we can skip
    // middle five numbers in below loop
    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;
}
 
// Function to Find primorial of order n
// (product of first n prime numbers).
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;
}
 
// Function to find next prime number greater
// than n
long long int findNextPrime(long long int n)
{
    // Note that difference (or m) should be
    // greater than 1.
    long long int nextPrime = n + 2;
 
    // loop continuously until isPrime
    // returns true for a number above n
    while (true) {
 
        // Ignoring the prime number that
        // is 1 greater than n
        if (isPrime(nextPrime))
            break;
 
        nextPrime++;
    }
 
    return nextPrime;
}
 
// Returns n-th Fortunate number
long long int fortunateNumber(int n)
{
   long long int p = primorial(n);
   return findNextPrime(p) - p;
}
 
// Driver function
int main()
{
    long long int n = 5;
    cout << fortunateNumber(n) << "\n";
    return 0;
}


Java




// Java program to find n-th Fortunate number
import java.lang.*;
import java.util.*;
 
class GFG
{
     
    public static boolean isPrime(int n)
    {
        // Corner cases
        if (n <= 1) return false;
        if (n <= 3) return true;
     
        // This is checked so that we can skip
        // middle five numbers in below loop
        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;
    }
     
    // Function to Find primorial of order n
    // (product of first n prime numbers).
    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;
    }
 
    // Function to find next prime number greater
    // than n
    public static int findNextPrime(int n)
    {
        // Note that difference (or m) should be
        // greater than 1.
        int nextPrime = n + 2;
     
        // loop continuously until isPrime
        // returns true for a number above n
        while (true) {
     
            // Ignoring the prime number that
            // is 1 greater than n
            if (isPrime(nextPrime) == true)
                break;
     
            nextPrime++;
       }
 
    return nextPrime;
    }
     
    // Returns n-th Fortunate number
    public static int fortunateNumber(int n)
    {
        int p = primorial(n);
        return findNextPrime(p)-p;
    }
     
    //Driver function
    public static void main (String[] args) {
        int n = 5;
        System.out.println(fortunateNumber(n));
    }
}
 
/*This code is contributed by Akash Singh*/


Python3




# Python3 program to find
# n-th Fortunate number
 
def isPrime(n):
 
    # Corner cases
    if (n <= 1): return False
    if (n <= 3): return True
 
    # This is checked so that we can skip
    # middle five numbers in below loop
    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
 
 
# Function to Find primorial of order n
# (product of first n prime numbers).
def primorial(n):
 
    p = 2; n -= 1; i = 3
    while(n != 0):
        if (isPrime(i)):
            p = p * i
            n -= 1
         
        i += 1
     
    return p
 
 
# Function to find next prime
# number greater than n
def findNextPrime(n):
 
    # Note that difference (or m)
    # should be greater than 1.
    nextPrime = n + 2
 
    # loop continuously until isPrime
    # returns true for a number above n
    while (True):
 
        # Ignoring the prime number that
        # is 1 greater than n
        if (isPrime(nextPrime)):
            break
 
        nextPrime += 1
     
    return nextPrime
 
# Returns n-th Fortunate number
def fortunateNumber(n):
    p = primorial(n)
    return findNextPrime(p) - p
 
# Driver Code
n = 5
print(fortunateNumber(n))
 
# This code is contributed by Anant Agarwal.


C#




// C# program to find
// n-th Fortunate number
using System;
 
class GFG
{
    public static bool isPrime(int n)
    {
        // Corner cases
        if (n <= 1) return false;
        if (n <= 3) return true;
     
        // This is checked so that
        // we can skip middle five
        // numbers in below loop
        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;
    }
     
    // Function to Find primorial
    // of order n (product of first
    // n prime numbers).
    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;
    }
 
    // Function to find next
    // prime number greater than n
    public static int findNextPrime(int n)
    {
        // Note that difference (or m)
        // should be greater than 1.
        int nextPrime = n + 2;
     
        // loop continuously until
        // isPrime returns true
        // for a number above n
        while (true)
        {
     
            // Ignoring the prime number
            // that is 1 greater than n
            if (isPrime(nextPrime) == true)
                break;
     
            nextPrime++;
    }
 
    return nextPrime;
    }
     
    // Returns n-th
    // Fortunate number
    public static int fortunateNumber(int n)
    {
        int p = primorial(n);
        return findNextPrime(p) - p;
    }
     
    // Driver Code
    public static void Main ()
    {
        int n = 5;
        Console.WriteLine(fortunateNumber(n));
    }
}
 
// This code is contributed
// by anuj_67.


PHP




<?php
// PHP program to find n-th
// Fortunate number
 
function isPrime($n)
{
     
    // Corner cases
    if ($n <= 1)
        return false;
    if ($n <= 3)
        return true;
 
    // This is checked so that we can skip
    // middle five numbers in below loop
    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 to Find primorial of order n
// (product of first n prime numbers).
function primorial($n)
{
    $p = 2;
    $n--;
    for ($i = 3; $n != 0; $i++)
    {
        if (isPrime($i))
        {
            $p = $p * $i;
            $n--;
        }
        $i++;
    }
    return $p;
}
 
// Function to find next prime
// number greater than n
function findNextPrime($n)
{
     
    // Note that difference (or m)
    // should be greater than 1.
    $nextPrime = $n + 2;
 
    // loop continuously until isPrime
    // returns true for a number above n
    while (true)
    {
 
        // Ignoring the prime number that
        // is 1 greater than n
        if (isPrime($nextPrime))
            break;
 
        $nextPrime++;
    }
 
    return $nextPrime;
}
 
// Returns n-th Fortunate number
function fortunateNumber($n)
{
    $p = primorial($n);
    return findNextPrime($p) - $p;
}
 
    // Driver Code
    $n = 5;
    echo fortunateNumber($n) , "\n";
 
// This code is contributed by ajit
?>


Javascript




<script>
 
// JavaScript program to find n-th Fortunate number
 
    function isPrime(n)
    {
        // Corner cases
        if (n <= 1) return false;
        if (n <= 3) return true;
       
        // This is checked so that we can skip
        // middle five numbers in below loop
        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 to Find primorial of order n
    // (product of first n prime numbers).
    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 to find next prime number greater
    // than n
    function findNextPrime(n)
    {
        // Note that difference (or m) should be
        // greater than 1.
        let nextPrime = n + 2;
       
        // loop continuously until isPrime
        // returns true for a number above n
        while (true) {
       
            // Ignoring the prime number that
            // is 1 greater than n
            if (isPrime(nextPrime) == true)
                break;
       
            nextPrime++;
       }
   
    return nextPrime;
    }
       
    // Returns n-th Fortunate number
    function fortunateNumber(n)
    {
        let p = primorial(n);
        return findNextPrime(p)-p;
    }
 
// Driver Code
 
        let n = 5;
        document.write(fortunateNumber(n));
 
</script>


Output: 

23

 

Optimization : The above solution can be optimized using Sieve of Eratosthenes
 



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads