📜  在数组中插入最小值,以使数组的和成为质数

📅  最后修改于: 2021-04-27 19:29:01             🧑  作者: Mango

给定一个由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 
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


C++
// C++ program to find minimum number to
// insert in array so their sum is prime
#include 
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[s] == 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


输出:

5

时间复杂度: O(N 2 )

高效方法:我们可以通过有效地预先计算一个大型布尔数组来优化上述方法,以检查数字是否为质数,而不是使用eranthoses的筛子。生成所有素数后,找到刚好大于和的素数并返回它们之间的差。

以下是此方法的实现:

C++

// C++ program to find minimum number to
// insert in array so their sum is prime
#include 
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[s] == 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


输出:

5

时间复杂度: O(N log(log N))