Given an array having N elements. The task is to check if the sum of prime elements of the array is prime or not.
Examples:
Input: arr[] = {1, 2, 3}
Output: Yes
As there are two primes in the array i.e. 2 and 3.
So, the sum of prime is 2 + 3 = 5 and 5 is also prime.
Input: arr[] = {2, 3, 2, 2}
Output: No
Approach: First find prime number up to 10^5 using Sieve. Then iterate over all elements of the array. If the number is prime then add it to sum. And finally, check whether the sum is prime or not. If prime then prints Yes otherwise No.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
#define ll long long int
#define MAX 100000
using namespace std;
bool prime[MAX];
void sieve()
{
memset (prime, true , sizeof (prime));
prime[0] = prime[1] = false ;
for ( int i = 2; i < MAX; i++)
if (prime[i])
for ( int j = 2 * i; j < MAX; j += i)
prime[j] = false ;
}
bool checkArray( int arr[], int n)
{
ll sum = 0;
for ( int i = 0; i < n; i++)
if (prime[arr[i]])
sum += arr[i];
if (prime[sum])
return true ;
return false ;
}
int main()
{
int arr[] = { 1, 2, 3 };
int n = sizeof (arr) / sizeof (arr[0]);
sieve();
if (checkArray(arr, n))
cout << "Yes" ;
else
cout << "No" ;
return 0;
}
|
Java
import java.io.*;
class GFG {
static int MAX = 100000 ;
static boolean prime[] = new boolean [MAX];
static void sieve()
{
for ( int i= 0 ;i<MAX;i++)
{
prime[i] = true ;
}
prime[ 0 ] = prime[ 1 ] = false ;
for ( int i = 2 ; i < MAX; i++)
if (prime[i])
for ( int j = 2 * i; j < MAX; j += i)
prime[j] = false ;
}
static boolean checkArray( int arr[], int n)
{
int sum = 0 ;
for ( int i = 0 ; i < n; i++)
if (prime[arr[i]])
sum += arr[i];
if (prime[sum])
return true ;
return false ;
}
public static void main (String[] args) {
int arr[] = { 1 , 2 , 3 };
int n = arr.length;
sieve();
if (checkArray(arr, n))
System.out.println( "Yes" );
else
System.out.println( "No" );
}
}
|
Python3
from math import gcd, sqrt
MAX = 100000
prime = [ True ] * MAX
def sieve() :
prime[ 0 ] = False
prime[ 1 ] = False
for i in range ( 2 , MAX ) :
if prime[i] :
for j in range ( 2 * * i, MAX , i) :
prime[j] = False
def checkArray(arr, n) :
sum = 0
for i in range (n) :
if prime[arr[i]] :
sum + = arr[i]
if prime[ sum ] :
return True
return False
if __name__ = = "__main__" :
arr = [ 1 , 2 , 3 ]
n = len (arr)
sieve()
if checkArray(arr, n) :
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
class GFG
{
static int MAX = 100000;
static bool [] prime = new bool [MAX];
static void sieve()
{
for ( int i = 0; i < MAX; i++)
{
prime[i] = true ;
}
prime[0] = prime[1] = false ;
for ( int i = 2; i < MAX; i++)
if (prime[i])
for ( int j = 2 * i;
j < MAX; j += i)
prime[j] = false ;
}
static bool checkArray( int [] arr, int n)
{
int sum = 0;
for ( int i = 0; i < n; i++)
if (prime[arr[i]])
sum += arr[i];
if (prime[sum])
return true ;
return false ;
}
public static void Main ()
{
int [] arr = new int [] { 1, 2, 3 };
int n = arr.Length;
sieve();
if (checkArray(arr, n))
Console.WriteLine( "Yes" );
else
Console.WriteLine( "No" );
}
}
|
PHP
<?php
function sieve()
{
$MAX = 100000;
$prime = array ( $MAX );
for ( $i = 0; $i < $MAX ; $i ++)
{
$prime [ $i ] = true;
}
$prime [0] = $prime [1] = false;
for ( $i = 2; $i < $MAX ; $i ++)
if ( $prime [ $i ])
for ( $j = 2 * $i ;
$j < $MAX ; $j += $i )
$prime [ $j ] = false;
}
function checkArray( $arr , $n )
{
$prime = array (100000);
$sum = 0;
for ( $i = 0; $i < $n ; $i ++)
if ( $prime [ $arr [ $i ]])
$sum += $arr [ $i ];
if ( $prime [ $sum ])
return true;
return false;
}
$arr = array (1, 2, 3);
$n = sizeof( $arr );
sieve();
if (checkArray( $arr , $n ))
echo "Yes" ;
else
echo "No" ;
?>
|
Javascript
<script>
function isPrime(n)
{
if (n <= 1)
return 0;
for (let i = 2; i < n; i++)
if (n % i == 0)
return 0;
return 1;
}
var prime = new Array(5);
function sieve()
{
for (i = 0; i <=5; i++)
{
prime[i] = isPrime(i);
}
}
function checkArray(arr, n)
{
sum = 0;
for (i = 0; i <= n; i++)
if (prime[arr[i]])
sum += arr[i];
if (sum)
return 1;
return 0;
}
var arr= [1, 2, 3];
n = 3;
sieve();
if (checkArray(arr, n))
document.write( "Yes" );
else
document.write( "No" );
</script>
|
Complexity Analysis:
- Time Complexity: O(n * log(log n))
- Auxiliary Space: O(MAX)
Approach 2:Without Sieve Array(No Extra Space)
The previous code used a sieve to pre-compute all primes up to a certain limit, and then used this pre-computed information to check if the sum of primes in the array is also prime. This approach requires extra memory to store the sieve array and runs in O(MAX*log(log(MAX))) time complexity, where MAX is the limit up to which primes are computed.
The new code optimizes the previous approach by checking if each number in the array is prime as we go through it. Instead of pre-computing all primes up to a certain limit, we only need to check if each number is divisible by any prime less than or equal to its square root. This approach does not require extra memory to store the sieve array.
C++
#include <bits/stdc++.h>
#define ll long long int
using namespace std;
bool isPrime( int n)
{
if (n <= 1)
return false ;
for ( int i = 2; i*i <= n; i++)
if (n % i == 0)
return false ;
return true ;
}
bool checkArray( int arr[], int n)
{
ll sum = 0;
for ( int i = 0; i < n; i++)
if (isPrime(arr[i]))
sum += arr[i];
if (isPrime(sum))
return true ;
return false ;
}
int main()
{
int arr[] = { 2,3,2,2 };
int n = sizeof (arr) / sizeof (arr[0]);
if (checkArray(arr, n))
cout << "Yes" ;
else
cout << "No" ;
return 0;
}
|
Java
import java.lang.Math;
public class Main {
static boolean isPrime( int n) {
if (n <= 1 ) {
return false ;
}
for ( int i = 2 ; i <= Math.sqrt(n); i++) {
if (n % i == 0 ) {
return false ;
}
}
return true ;
}
static boolean checkArray( int [] arr, int n) {
int sum = 0 ;
for ( int i = 0 ; i < n; i++) {
if (isPrime(arr[i])) {
sum += arr[i];
}
}
if (isPrime(sum)) {
return true ;
}
return false ;
}
public static void main(String[] args) {
int [] arr = { 1 , 2 , 3 };
int n = arr.length;
if (checkArray(arr, n)) {
System.out.println( "Yes" );
} else {
System.out.println( "No" );
}
}
}
|
Python3
def isPrime(n):
if n < = 1 :
return False
for i in range ( 2 , int (n * * 0.5 ) + 1 ):
if n % i = = 0 :
return False
return True
def checkArray(arr, n):
sum = 0
for i in range (n):
if isPrime(arr[i]):
sum + = arr[i]
if isPrime( sum ):
return True
return False
arr = [ 1 , 2 , 3 ]
n = len (arr)
if checkArray(arr, n):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
public class MainClass {
static bool IsPrime( int n) {
if (n <= 1) {
return false ;
}
for ( int i = 2; i <= Math.Sqrt(n); i++) {
if (n % i == 0) {
return false ;
}
}
return true ;
}
static bool CheckArray( int [] arr, int n) {
int sum = 0;
for ( int i = 0; i < n; i++) {
if (IsPrime(arr[i])) {
sum += arr[i];
}
}
if (IsPrime(sum)) {
return true ;
}
return false ;
}
public static void Main() {
int [] arr = {1, 2, 3};
int n = arr.Length;
if (CheckArray(arr, n)) {
Console.WriteLine( "Yes" );
} else {
Console.WriteLine( "No" );
}
}
}
|
Javascript
function isPrime(n) {
if (n <= 1) {
return false ;
}
for (let i = 2; i <= Math.sqrt(n); i++) {
if (n % i === 0) {
return false ;
}
}
return true ;
}
function checkArray(arr, n) {
let sum = 0;
for (let i = 0; i < n; i++) {
if (isPrime(arr[i])) {
sum += arr[i];
}
}
if (isPrime(sum)) {
return true ;
}
return false ;
}
const arr = [1, 2, 3];
const n = arr.length;
if (checkArray(arr, n)) {
console.log( "Yes" );
} else {
console.log( "No" );
}
|
Complexity Analysis:
Time Complexity: O(n * sqrt(max(arr))).
Auxiliary Space: O(1)
Please Login to comment...