本文概述
给定n个整数数组。找到要插入数组的最小数目, 以便数组所有元素的和成为素数。如果sum已经是质数, 则返回0。
例子 :
Input : arr[] = { 2, 4, 6, 8, 12 }
Output : 5
Input : arr[] = { 3, 5, 7 }
Output : 0
简单的方法:解决此问题的最简单方法是首先找到数组元素的总和。然后检查此和是否为素数, 如果和为素数则返回零, 否则找到比该和大的素数。通过从(sum + 1)直到找到素数, 检查一个数字是否为素数, 我们可以找到大于素数的总和。一旦找到刚好大于和的质数, 则返回和与该质数的差。
下面是上述想法的实现:
C ++
//C++ program to find minimum number to
//insert in array so their sum is prime
#include <bits/stdc++.h>
using namespace std;
//function to check if a
//number is prime or not
bool isPrime( int n)
{
//Corner case
if (n <= 1)
return false ;
//Check from 2 to n - 1
for ( int i = 2; i <n; i++)
if (n % i == 0)
return false ;
return true ;
}
//Find prime number
//greater than a number
int findPrime( int n)
{
int num = n + 1;
//find prime greater than n
while (num)
{
//check if num is prime
if (isPrime(num))
return num;
//increment num
num = num + 1;
}
return 0;
}
//To find number to be added
//so sum of array is prime
int minNumber( int arr[], int n)
{
int sum = 0;
//To find sum of array elements
for ( int i = 0; i <n; i++)
sum += arr[i];
//if sum is already prime
//return 0
if (isPrime(sum))
return 0;
//To find prime number
//greater than sum
int num = findPrime(sum);
//Return difference of
//sum and num
return num - sum;
}
//Driver code
int main()
{
int arr[] = { 2, 4, 6, 8, 12 };
int n = sizeof (arr) /sizeof (arr[0]);
cout <<minNumber(arr, n);
return 0;
}
Java
//Java program to find minimum number to
//insert in array so their sum is prime
class GFG
{
//function to check if a
//number is prime or not
static boolean isPrime( int n)
{
//Corner case
if (n <= 1 )
return false ;
//Check from 2 to n - 1
for ( int i = 2 ; i <n; i++)
if (n % i == 0 )
return false ;
return true ;
}
//Find prime number
//greater than a number
static int findPrime( int n)
{
int num = n + 1 ;
//find prime greater than n
while (num> 0 )
{
//check if num is prime
if (isPrime(num))
return num;
//increment num
num = num + 1 ;
}
return 0 ;
}
//To find number to be added
//so sum of array is prime
static int minNumber( int arr[], int n)
{
int sum = 0 ;
//To find sum of array elements
for ( int i = 0 ; i <n; i++)
sum += arr[i];
//if sum is already prime
//return 0
if (isPrime(sum))
return 0 ;
//To find prime number
//greater than sum
int num = findPrime(sum);
//Return difference of
//sum and num
return num - sum;
}
//Driver Code
public static void main(String[]args)
{
int arr[] = { 2 , 4 , 6 , 8 , 12 };
int n = arr.length;
System.out.println(minNumber(arr, n));
}
}
//This code is contributed by Azkia Anam.
Python3
# Python3 program to find minimum number to
# insert in array so their sum is prime
# function to check if a
# number is prime or not
def isPrime(n):
# Corner case
if n <= 1 :
return False
# Check from 2 to n - 1
for i in range ( 2 , n):
if n % i = = 0 :
return False
return True
# Find prime number
# greater than a number
def findPrime(n):
num = n + 1
# find prime greater than n
while (num):
# check if num is prime
if isPrime(num):
return num
# Increment num
num + = 1
return 0
# To find number to be added
# so sum of array is prime
def minNumber(arr):
s = 0
# To find sum of array elements
for i in range ( 0 , len (arr)):
s + = arr[i]
# If sum is already prime
# return 0
if isPrime(s) :
return 0
# To find prime number
# greater than sum
num = findPrime(s)
# Return differnece of sum and num
return num - s
# Driver code
arr = [ 2 , 4 , 6 , 8 , 12 ]
print (minNumber(arr))
# This code is contributed by Sachin Bisht
C#
//C# program to find minimum number to
//insert in array so their sum is prime
using System;
class GFG
{
//function to check if a
//number is prime or not
static bool isPrime( int n)
{
//Corner case
if (n <= 1)
return false ;
//Check from 2 to n - 1
for ( int i = 2; i <n; i++)
if (n % i == 0)
return false ;
return true ;
}
//Find prime number
//greater than a number
static int findPrime( int n)
{
int num = n + 1;
//find prime greater than n
while (num> 0)
{
//check if num is prime
if (isPrime(num))
return num;
//increment num
num = num + 1;
}
return 0;
}
//To find number to be added
//so sum of array is prime
static int minNumber( int []arr, int n)
{
int sum = 0;
//To find sum of array elements
for ( int i = 0; i <n; i++)
sum += arr[i];
//if sum is already prime
//return 0
if (isPrime(sum))
return 0;
//To find prime number
//greater than sum
int num = findPrime(sum);
//Return difference of sum and num
return num - sum;
}
//Driver Code
public static void Main()
{
int []arr = { 2, 4, 6, 8, 12 };
int n = arr.Length;
Console.Write(minNumber(arr, n));
}
}
//This code is contributed by nitin mittal
PHP
<?php
//PHP program to find minimum number to
//insert in array so their sum is prime
//function to check if a
//number is prime or not
function isPrime( $n )
{
//Corner case
if ( $n <= 1)
return false;
//Check from 2 to n - 1
for ( $i = 2; $i <$n ; $i ++)
if ( $n % $i == 0)
return false;
return true;
}
//Find prime number
//greater than a number
function findPrime( $n )
{
$num = $n + 1;
//find prime greater than n
while ( $num )
{
//check if num is prime
if (isPrime( $num ))
return $num ;
//increment num
$num = $num + 1;
}
return 0;
}
//To find number to be added
//so sum of array is prime
function minNumber( $arr , $n )
{
$sum = 0;
//To find sum of array elements
for ( $i = 0; $i <$n ; $i ++)
$sum += $arr [ $i ];
//if sum is already prime
//return 0
if (isPrime( $sum ))
return 0;
//To find prime number
//greater than sum
$num = findPrime( $sum );
//Return difference of
//sum and num
return $num - $sum ;
}
//Driver Code
$arr = array (2, 4, 6, 8, 12);
$n = sizeof( $arr );
echo minNumber( $arr , $n );
//This code is contributed by nitin mittal
?>
输出如下:
5
时间复杂度:O(N^2)
高效方法:我们可以通过有效地预先计算大型布尔数组来检查数字是否为质数来优化上述方法ant筛。生成所有素数后, 找到刚好大于和的素数并返回它们之间的差。
以下是此方法的实现:
C ++
//C++ program to find minimum number to
//insert in array so their sum is prime
#include <bits/stdc++.h>
using namespace std;
#define MAX 100005
//Array to store primes
bool isPrime[MAX];
//function to calculate primes
//using sieve of eratosthenes
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 ;
}
}
}
//Find prime number
//greater than a number
int findPrime( int n)
{
int num = n + 1;
//To return prime number
//greater than n
while (num)
{
//check if num is prime
if (isPrime[num])
return num;
//increment num
num = num + 1;
}
return 0;
}
//To find number to be added
//so sum of array is prime
int minNumber( int arr[], int n)
{
//call sieveOfEratostheneses
//to calculate primes
sieveOfEratostheneses();
int sum = 0;
//To find sum of array elements
for ( int i = 0; i <n; i++)
sum += arr[i];
if (isPrime[sum])
return 0;
//To find prime number
//greater then sum
int num = findPrime(sum);
//Return difference of
//sum and num
return num - sum;
}
//Driver Code
int main()
{
int arr[] = { 2, 4, 6, 8, 12 };
int n = sizeof (arr) /sizeof (arr[0]);
cout <<minNumber(arr, n);
return 0;
}
Java
//Java program to find minimum number to
//insert in array so their sum is prime
class GFG
{
static int MAX = 100005 ;
//Array to store primes
static boolean [] isPrime = new boolean [MAX];
//function to calculate primes
//using sieve of eratosthenes
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 ;
}
}
}
//Find prime number greater
//than a number
static int findPrime( int n)
{
int num = n + 1 ;
//To return prime number
//greater than n
while (num> 0 )
{
//check if num is prime
if (!isPrime[num])
return num;
//increment num
num = num + 1 ;
}
return 0 ;
}
//To find number to be added
//so sum of array is prime
static int minNumber( int arr[], int n)
{
//call sieveOfEratostheneses
//to calculate primes
sieveOfEratostheneses();
int sum = 0 ;
//To find sum of array elements
for ( int i = 0 ; i <n; i++)
sum += arr[i];
if (!isPrime[sum])
return 0 ;
//To find prime number
//greater then sum
int num = findPrime(sum);
//Return difference of
//sum and num
return num - sum;
}
//Driver Code
public static void main(String[] args)
{
int arr[] = { 2 , 4 , 6 , 8 , 12 };
int n = arr.length;
System.out.println(minNumber(arr, n));
}
}
//This code is contributed by mits
Python3
# Python3 program to find minimum number to
# insert in array so their sum is prime
isPrime = [ 1 ] * 100005
# function to calculate prime
# using sieve of eratosthenes
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
# Find prime number
# greater than a number
def findPrime(n):
num = n + 1
# find prime greater than n
while (num):
# check if num is prime
if isPrime[num]:
return num
# Increment num
num + = 1
return 0
# To find number to be added
# so sum of array is prime
def minNumber(arr):
# call sieveOfEratostheneses to
# calculate primes
sieveOfEratostheneses()
s = 0
# To find sum of array elements
for i in range ( 0 , len (arr)):
s + = arr[i]
# If sum is already prime
# return 0
if isPrime展开 = = True :
return 0
# To find prime number
# greater than sum
num = findPrime(s)
# Return differnece of
# sum and num
return num - s
# Driver code
arr = [ 2 , 4 , 6 , 8 , 12 ]
print (minNumber(arr))
# This code is contributed by Sachin Bisht
C#
//C# program to find minimum number to
//insert in array so their sum is prime
class GFG
{
static int MAX = 100005;
//Array to store primes
static bool [] isPrime = new bool [MAX];
//function to calculate primes
//using sieve of eratosthenes
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 ;
}
}
}
//Find prime number greater
//than a number
static int findPrime( int n)
{
int num = n + 1;
//To return prime number
//greater than n
while (num> 0)
{
//check if num is prime
if (!isPrime[num])
return num;
//increment num
num = num + 1;
}
return 0;
}
//To find number to be added
//so sum of array is prime
static int minNumber( int [] arr, int n)
{
//call sieveOfEratostheneses
//to calculate primes
sieveOfEratostheneses();
int sum = 0;
//To find sum of array elements
for ( int i = 0; i <n; i++)
sum += arr[i];
if (!isPrime[sum])
return 0;
//To find prime number
//greater then sum
int num = findPrime(sum);
//Return difference of
//sum and num
return num - sum;
}
//Driver Code
public static void Main()
{
int [] arr = { 2, 4, 6, 8, 12 };
int n = arr.Length;
System.Console.WriteLine(minNumber(arr, n));
}
}
//This code is contributed by mits
PHP
<?php
//PHP program to find minimum number to
//insert in array so their sum is prime
$MAX =100005;
//function to calculate primes
//using sieve of eratosthenes
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;
}
}
}
//Find prime number
//greater than a number
function findPrime( $n )
{
$num = $n + 1;
//To return prime number
//greater than n
while ( $num )
{
//check if num is prime
if ( $isPrime [ $num ])
return $num ;
//increment num
$num = $num + 1;
}
return 0;
}
//To find number to be added
//so sum of array is prime
function minNumber(& $arr , $n )
{
//call sieveOfEratostheneses
//to calculate primes
sieveOfEratostheneses();
$sum = 0;
//To find sum of array elements
for ( $i = 0; $i <$n ; $i ++)
$sum += $arr [ $i ];
if ( $isPrime [ $sum ])
return 0;
//To find prime number
//greater then sum
$num = findPrime( $sum );
//Return difference of
//sum and num
return $num - $sum ;
}
//Driver Code
$arr = array ( 2, 4, 6, 8, 12 );
$n = sizeof( $arr ) /sizeof( $arr [0]);
echo minNumber( $arr , $n );
return 0;
?>
输出如下:
5
时间复杂度:O(N log(log N))
如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。