Program For Closest Prime Number

Given a number N, you have to print its closest prime number. The prime number can be lesser, equal, or greater than the given number.
Condition: 1 ≤ N ≤ 100000
Examples:
Input : 16 Output: 17 Explanation: The two nearer prime number of 16 are 13 and 17. But among these, 17 is the closest(As its distance is only 1(17-16) from the given number). Input : 97 Output : 97 Explanation : The closest prime number in this case is the given number number itself as the distance is 0 (97-97).
Approach :
- Using Sieve of Eratosthenes store all prime numbers in a Vector.
 - Copy all elements in vector to the new array.
 - Use the upper bound to find the upper bound of the given number in an array.
 - As the array is already sorted in nature, compare previous and current indexed numbers in an array.
 - Return number with the smallest difference.
 
Below is the implementation of the approach.
C++
#include <iostream>#include <vector>using namespace std;const int MAX = 100005;vector<int> primeNumber;// Sieve of Eratosthenes algorithm to find all prime numbers up to MAXvoid sieveOfEratosthenes() {    // Create a boolean array "prime[0..n]" and initialize all entries as true.    // A value in prime[i] will finally be false if i is not a prime, else true.    bool prime[MAX + 1];    for (int i = 0; i <= MAX; i++) {        prime[i] = true;    }    // Update all multiples of p    for (int p = 2; p * p <= MAX; p++) {        // If prime[p] is not changed, then it is a prime        if (prime[p] == true) {            for (int i = p * p; i <= MAX; i += p) {                prime[i] = false;            }        }    }    // Add all prime numbers to the vector    for (int i = 2; i <= MAX; i++) {        if (prime[i] == true) {            primeNumber.push_back(i);        }    }}// Binary search to find the index of the smallest element greater than numberint upper_bound(vector<int> arr, int low, int high, int number) {    // Base case    if (low > high) {        return low;    }    // Find the middle index    int mid = low + (high - low) / 2;    // If arr[mid] is less than or equal to number, search in the right subarray    if (arr[mid] <= number) {        return upper_bound(arr, mid + 1, high, number);    }    // If arr[mid] is greater than number, search in the left subarray    return upper_bound(arr, low, mid - 1, number);}// Function to find the closest prime number to a given numberint closestPrime(int number) {    // Handle special case of number 1 explicitly    if (number == 1) {        return 2;    }    else {        // Generate all prime numbers using Sieve of Eratosthenes algorithm        sieveOfEratosthenes();        // Convert vector to array for binary search        int n = primeNumber.size();        int arr[n];        for (int i = 0; i < n; i++) {            arr[i] = primeNumber[i];        }        // Find the index of the smallest element greater than number        int index = upper_bound(primeNumber, 0, n, number);        // Check if the current element or the previous element is the closest        if (arr[index] == number || arr[index - 1] == number) {            return number;        }        else if (abs(arr[index] - number) < abs(arr[index - 1] - number)) {            return arr[index];        }        else {            return arr[index - 1];        }    }}// Driver program to test the above functionint main() {    int number = 100;    cout << closestPrime(number) << endl;    return 0;} | 
Java
// Closest Prime Number in Javaimport java.util.*;import java.lang.*;public class GFG {    static int max = 100005;    static Vector<Integer> primeNumber = new Vector<>();    static void sieveOfEratosthenes()    {        // Create a boolean array "prime[0..n]" and        // initialize all entries it as true. A value        // in prime[i] will finally be false if i is        // Not a prime, else true.        boolean prime[] = new boolean[max + 1];        for (int i = 0; i <= max; i++)            prime[i] = true;        for (int p = 2; p * p <= max; 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 * p; i <= max; i += p)                    prime[i] = false;            }        }        // Print all prime numbers        for (int i = 2; i <= max; i++) {            if (prime[i] == true)                primeNumber.add(i);        }    }    static int upper_bound(Integer arr[], int low, int high,                           int X)    {        // Base Case        if (low > high)            return low;        // Find the middle index        int mid = low + (high - low) / 2;        // If arr[mid] is less than        // or equal to X search in        // right subarray        if (arr[mid] <= X) {            return upper_bound(arr, mid + 1, high, X);        }        // If arr[mid] is greater than X        // then search in left subarray        return upper_bound(arr, low, mid - 1, X);    }    public static int closetPrime(int number)    {        // We will handle it (for number = 1) explicitly        // as the lower/left number of 1 can give us        // negative index which will cost Runtime Error.        if (number == 1)            return 2;        else {            // calling sieve of eratosthenes to            // fill the array into prime numbers            sieveOfEratosthenes();            Integer[] arr = primeNumber.toArray(                new Integer[primeNumber.size()]);            // searching the index            int index                = upper_bound(arr, 0, arr.length, number);            if (arr[index] == number                || arr[index - 1] == number)                return number;            else if (Math.abs(arr[index] - number)                     < Math.abs(arr[index - 1] - number))                return arr[index];            else                return arr[index - 1];        }    }    // Driver Program    public static void main(String[] args)    {        int number = 100;        System.out.println(closetPrime(number));    }} | 
Python3
# python code for the above approachimport bisectimport mathMAX = 100005prime_numbers = []# Sieve of Eratosthenes algorithm to find all prime numbers up to MAXdef sieve_of_eratosthenes():    # Create a boolean array "prime[0..n]" and initialize all entries as true.    # A value in prime[i] will finally be false if i is not a prime, else true.    prime = [True] * (MAX + 1)    # Update all multiples of p    for p in range(2, int(math.sqrt(MAX)) + 1):        # If prime[p] is not changed, then it is a prime        if prime[p]:            for i in range(p * p, MAX + 1, p):                prime[i] = False    # Add all prime numbers to the list    for i in range(2, MAX + 1):        if prime[i]:            prime_numbers.append(i)# Function to find the closest prime number to a given numberdef closest_prime(number):    # Handle special case of number 1 explicitly    if number == 1:        return 2    else:        # Generate all prime numbers using Sieve of Eratosthenes algorithm        sieve_of_eratosthenes()        # Find the index of the smallest element greater than number        index = bisect.bisect_left(prime_numbers, number)        # Check if the current element or the previous element is the closest        if prime_numbers[index] == number or prime_numbers[index - 1] == number:            return number        elif abs(prime_numbers[index] - number) < abs(prime_numbers[index - 1] - number):            return prime_numbers[index]        else:            return prime_numbers[index - 1]# Driver program to test the above functionif __name__ == '__main__':    number = 100    print(closest_prime(number)) | 
Javascript
const MAX = 100005;let primeNumber = [];// Sieve of Eratosthenes algorithm to find all prime numbers up to MAXfunction sieveOfEratosthenes() {  // Create a boolean array "prime[0..n]" and initialize all entries as true.  // A value in prime[i] will finally be false if i is not a prime, else true.  let prime = Array(MAX + 1).fill(true);  // Update all multiples of p  for (let p = 2; p * p <= MAX; p++) {    // If prime[p] is not changed, then it is a prime    if (prime[p] == true) {      for (let i = p * p; i <= MAX; i += p) {        prime[i] = false;      }    }  }  // Add all prime numbers to the vector  for (let i = 2; i <= MAX; i++) {    if (prime[i] == true) {      primeNumber.push(i);    }  }}// Binary search to find the index of the smallest element greater than numberfunction upper_bound(arr, low, high, number) {  // Base case  if (low > high) {    return low;  }  // Find the middle index  let mid = low + Math.floor((high - low) / 2);  // If arr[mid] is less than or equal to number, search in the right subarray  if (arr[mid] <= number) {    return upper_bound(arr, mid + 1, high, number);  }  // If arr[mid] is greater than number, search in the left subarray  return upper_bound(arr, low, mid - 1, number);}// Function to find the closest prime number to a given numberfunction closestPrime(number) {  // Handle special case of number 1 explicitly  if (number == 1) {    return 2;  } else {    // Generate all prime numbers using Sieve of Eratosthenes algorithm    sieveOfEratosthenes();    // Find the index of the smallest element greater than number    let index = upper_bound(primeNumber, 0, primeNumber.length, number);    // Check if the current element or the previous element is the closest    if (primeNumber[index] == number || primeNumber[index - 1] == number) {      return number;    } else if (Math.abs(primeNumber[index] - number) < Math.abs(primeNumber[index - 1] - number)) {      return primeNumber[index];    } else {      return primeNumber[index - 1];    }  }}// Driver program to test the above functionlet number = 100;console.log(closestPrime(number)); | 
C#
//C# code for the above approachusing System;using System.Collections.Generic;public class Program{    const int MAX = 100005;    static List<int> prime_numbers = new List<int>();    // Sieve of Eratosthenes algorithm to find all prime numbers up to MAX    static void sieve_of_eratosthenes()    {        // Create a boolean array "prime[0..n]" and initialize all entries as true.        // A value in prime[i] will finally be false if i is not a prime, else true.        bool[] prime = new bool[MAX + 1];        for (int i = 0; i <= MAX; i++)        {            prime[i] = true;        }        // Update all multiples of p        for (int p = 2; p <= Math.Sqrt(MAX); p++)        {            // If prime[p] is not changed, then it is a prime            if (prime[p])            {                for (int i = p * p; i <= MAX; i += p)                {                    prime[i] = false;                }            }        }        // Add all prime numbers to the list        for (int i = 2; i <= MAX; i++)        {            if (prime[i])            {                prime_numbers.Add(i);            }        }    }    // Function to find the closest prime number to a given number    static int closest_prime(int number)    {        // Handle special case of number 1 explicitly        if (number == 1)        {            return 2;        }        else        {            // Generate all prime numbers using Sieve of Eratosthenes algorithm            sieve_of_eratosthenes();            // Find the index of the smallest element greater than number            int index = prime_numbers.BinarySearch(number);            if (index < 0)            {                index = ~index;            }            // Check if the current element or the previous element is the closest            if (prime_numbers[index] == number || prime_numbers[index - 1] == number)            {                return number;            }            else if (Math.Abs(prime_numbers[index] - number) < Math.Abs(prime_numbers[index - 1] - number))            {                return prime_numbers[index];            }            else            {                return prime_numbers[index - 1];            }        }    }    // Driver program to test the above function    public static void Main()    {        int number = 100;        Console.WriteLine(closest_prime(number));    }}//This code is contributed by shivamsharma215 | 
Output
101
Time Complexity: O(N log(log(N)))
Auxiliary Space: O(N)
				
					


