Insert minimum number in array so that sum of array becomes prime
Given an array of n integers. Find minimum number to be inserted in array, so that sum of all elements of array becomes prime. If sum is already prime, then return 0.
Examples :
Input : arr[] = { 2, 4, 6, 8, 12 }
Output : 5
Input : arr[] = { 3, 5, 7 }
Output : 0
Naive approach: The simplest approach to solve this problem is to first find the sum of array elements. Then check if this sum is prime or not, if sum is prime return zero otherwise find prime number just greater than this sum. We can find prime number greater than sum by checking if a number is prime or not from (sum+1) until we find a prime number. Once a prime number just greater than sum is found, return difference of sum and this prime number.
Below is implementation of above idea:
C++
#include <bits/stdc++.h>
using namespace std;
bool isPrime( int n)
{
if (n <= 1)
return false ;
for ( int i = 2; i < n; i++)
if (n % i == 0)
return false ;
return true ;
}
int findPrime( int n)
{
int num = n + 1;
while (num)
{
if (isPrime(num))
return num;
num = num + 1;
}
return 0;
}
int minNumber( int arr[], int n)
{
int sum = 0;
for ( int i = 0; i < n; i++)
sum += arr[i];
if (isPrime(sum))
return 0;
int num = findPrime(sum);
return num - sum;
}
int main()
{
int arr[] = { 2, 4, 6, 8, 12 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << minNumber(arr, n);
return 0;
}
|
Java
class GFG
{
static boolean isPrime( int n)
{
if (n <= 1 )
return false ;
for ( int i = 2 ; i < n; i++)
if (n % i == 0 )
return false ;
return true ;
}
static int findPrime( int n)
{
int num = n + 1 ;
while (num > 0 )
{
if (isPrime(num))
return num;
num = num + 1 ;
}
return 0 ;
}
static int minNumber( int arr[], int n)
{
int sum = 0 ;
for ( int i = 0 ; i < n; i++)
sum += arr[i];
if (isPrime(sum))
return 0 ;
int num = findPrime(sum);
return num - sum;
}
public static void main(String[]args)
{
int arr[] = { 2 , 4 , 6 , 8 , 12 };
int n = arr.length;
System.out.println(minNumber(arr, n));
}
}
|
Python3
def isPrime(n):
if n < = 1 :
return False
for i in range ( 2 , n):
if n % i = = 0 :
return False
return True
def findPrime(n):
num = n + 1
while (num):
if isPrime(num):
return num
num + = 1
return 0
def minNumber(arr):
s = 0
for i in range ( 0 , len (arr)):
s + = arr[i]
if isPrime(s) :
return 0
num = findPrime(s)
return num - s
arr = [ 2 , 4 , 6 , 8 , 12 ]
print (minNumber(arr))
|
C#
using System;
class GFG
{
static bool isPrime( int n)
{
if (n <= 1)
return false ;
for ( int i = 2; i < n; i++)
if (n % i == 0)
return false ;
return true ;
}
static int findPrime( int n)
{
int num = n + 1;
while (num > 0)
{
if (isPrime(num))
return num;
num = num + 1;
}
return 0;
}
static int minNumber( int []arr, int n)
{
int sum = 0;
for ( int i = 0; i < n; i++)
sum += arr[i];
if (isPrime(sum))
return 0;
int num = findPrime(sum);
return num - sum;
}
public static void Main()
{
int []arr = { 2, 4, 6, 8, 12 };
int n = arr.Length;
Console.Write(minNumber(arr, n));
}
}
|
PHP
<?php
function isPrime( $n )
{
if ( $n <= 1)
return false;
for ( $i = 2; $i < $n ; $i ++)
if ( $n % $i == 0)
return false;
return true;
}
function findPrime( $n )
{
$num = $n + 1;
while ( $num )
{
if (isPrime( $num ))
return $num ;
$num = $num + 1;
}
return 0;
}
function minNumber( $arr , $n )
{
$sum = 0;
for ( $i = 0; $i < $n ; $i ++)
$sum += $arr [ $i ];
if (isPrime( $sum ))
return 0;
$num = findPrime( $sum );
return $num - $sum ;
}
$arr = array (2, 4, 6, 8, 12);
$n = sizeof( $arr );
echo minNumber( $arr , $n );
?>
|
Javascript
<script>
function isPrime(n)
{
if (n <= 1)
return false ;
for (let i = 2; i < n; i++)
if (n % i == 0)
return false ;
return true ;
}
function findPrime(n)
{
let num = n + 1;
while (num > 0)
{
if (isPrime(num))
return num;
num = num + 1;
}
return 0;
}
function minNumber(arr,n)
{
let sum = 0;
for (let i = 0; i < n; i++)
sum += arr[i];
if (isPrime(sum))
return 0;
let num = findPrime(sum);
return num - sum;
}
let arr=[2, 4, 6, 8, 12 ];
let n = arr.length;
document.write(minNumber(arr, n));
</script>
|
Time Complexity: O( N2 )
Efficient Approach: We can optimize the above approach by efficiently pre calculating a large boolean array to check if a number is prime or not using sieve of eratosthenes. Once all prime number are generated, find prime number just greater than sum and return the difference between them.
Below is the implementation of this approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define MAX 100005
bool isPrime[MAX];
void sieveOfEratostheneses()
{
memset (isPrime, true , sizeof (isPrime));
isPrime[1] = false ;
for ( int i = 2; i * i < MAX; i++)
{
if (isPrime[i])
{
for ( int j = 2 * i; j < MAX; j += i)
isPrime[j] = false ;
}
}
}
int findPrime( int n)
{
int num = n + 1;
while (num)
{
if (isPrime[num])
return num;
num = num + 1;
}
return 0;
}
int minNumber( int arr[], int n)
{
sieveOfEratostheneses();
int sum = 0;
for ( int i = 0; i < n; i++)
sum += arr[i];
if (isPrime[sum])
return 0;
int num = findPrime(sum);
return num - sum;
}
int main()
{
int arr[] = { 2, 4, 6, 8, 12 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << minNumber(arr, n);
return 0;
}
|
Java
class GFG
{
static int MAX = 100005 ;
static boolean [] isPrime = new boolean [MAX];
static void sieveOfEratostheneses()
{
isPrime[ 1 ] = true ;
for ( int i = 2 ; i * i < MAX; i++)
{
if (!isPrime[i])
{
for ( int j = 2 * i; j < MAX; j += i)
isPrime[j] = true ;
}
}
}
static int findPrime( int n)
{
int num = n + 1 ;
while (num > 0 )
{
if (!isPrime[num])
return num;
num = num + 1 ;
}
return 0 ;
}
static int minNumber( int arr[], int n)
{
sieveOfEratostheneses();
int sum = 0 ;
for ( int i = 0 ; i < n; i++)
sum += arr[i];
if (!isPrime[sum])
return 0 ;
int num = findPrime(sum);
return num - sum;
}
public static void main(String[] args)
{
int arr[] = { 2 , 4 , 6 , 8 , 12 };
int n = arr.length;
System.out.println(minNumber(arr, n));
}
}
|
Python3
isPrime = [ 1 ] * 100005
def sieveOfEratostheneses():
isPrime[ 1 ] = False
i = 2
while i * i < 100005 :
if (isPrime[i]):
j = 2 * i
while j < 100005 :
isPrime[j] = False
j + = i
i + = 1
return
def findPrime(n):
num = n + 1
while (num):
if isPrime[num]:
return num
num + = 1
return 0
def minNumber(arr):
sieveOfEratostheneses()
s = 0
for i in range ( 0 , len (arr)):
s + = arr[i]
if isPrime[s] = = True :
return 0
num = findPrime(s)
return num - s
arr = [ 2 , 4 , 6 , 8 , 12 ]
print (minNumber(arr))
|
C#
class GFG
{
static int MAX = 100005;
static bool [] isPrime = new bool [MAX];
static void sieveOfEratostheneses()
{
isPrime[1] = true ;
for ( int i = 2; i * i < MAX; i++)
{
if (!isPrime[i])
{
for ( int j = 2 * i; j < MAX; j += i)
isPrime[j] = true ;
}
}
}
static int findPrime( int n)
{
int num = n + 1;
while (num > 0)
{
if (!isPrime[num])
return num;
num = num + 1;
}
return 0;
}
static int minNumber( int [] arr, int n)
{
sieveOfEratostheneses();
int sum = 0;
for ( int i = 0; i < n; i++)
sum += arr[i];
if (!isPrime[sum])
return 0;
int num = findPrime(sum);
return num - sum;
}
public static void Main()
{
int [] arr = { 2, 4, 6, 8, 12 };
int n = arr.Length;
System.Console.WriteLine(minNumber(arr, n));
}
}
|
PHP
<?php
$MAX =100005;
function sieveOfEratostheneses()
{
$isPrime = array_fill (true, $MAX , NULL);
$isPrime [1] = false;
for ( $i = 2; $i * $i < $MAX ; $i ++)
{
if ( $isPrime [ $i ])
{
for ( $j = 2 * $i ; $j < $MAX ; $j += $i )
$isPrime [ $j ] = false;
}
}
}
function findPrime( $n )
{
$num = $n + 1;
while ( $num )
{
if ( $isPrime [ $num ])
return $num ;
$num = $num + 1;
}
return 0;
}
function minNumber(& $arr , $n )
{
sieveOfEratostheneses();
$sum = 0;
for ( $i = 0; $i < $n ; $i ++)
$sum += $arr [ $i ];
if ( $isPrime [ $sum ])
return 0;
$num = findPrime( $sum );
return $num - $sum ;
}
$arr = array ( 2, 4, 6, 8, 12 );
$n = sizeof( $arr ) / sizeof( $arr [0]);
echo minNumber( $arr , $n );
return 0;
?>
|
Javascript
<script>
let MAX = 100005;
let isPrime = new Array(MAX).fill(0);
function sieveOfEratostheneses()
{
isPrime[1] = true ;
for (let i = 2; i * i < MAX; i++)
{
if (!isPrime[i])
{
for (let j = 2 * i; j < MAX; j += i)
isPrime[j] = true ;
}
}
}
function findPrime(n)
{
let num = n + 1;
while (num > 0)
{
if (!isPrime[num])
return num;
num = num + 1;
}
return 0;
}
function minNumber(arr, n)
{
sieveOfEratostheneses();
let sum = 0;
for (let i = 0; i < n; i++)
sum += arr[i];
if (!isPrime[sum])
return 0;
let num = findPrime(sum);
return num - sum;
}
let arr = [ 2, 4, 6, 8, 12 ];
let n = arr.length;
document.write(minNumber(arr, n));
</script>
|
Time Complexity: O(N log(log N))
Last Updated :
18 Jan, 2024
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...