Bitwise AND of the sum of prime numbers and the sum of composite numbers in an array
Last Updated :
04 May, 2021
Given an array of positive numbers, the task is to find the bitwise AND of the sum of non-prime numbers and the sum of prime numbers. Note that 1 is neither prime nor composite.
Examples:
Input: arr[] = {1, 3, 5, 10, 15, 7}
Output: 9
Sum of non-primes = 10 + 15 = 25
Sum of primes = 3 + 5 + 7 = 15
25 & 15 = 9
Input: arr[] = {3, 4, 6, 7}
Output: 10
Naive approach: A simple solution is to traverse the array and keep checking for every element if it is prime or not. If the number is prime, then add it to S1 which stores the sum of prime numbers from the array else add it to S2 which stores the sum of non-prime numbers. Finally, print S1 & S2.
Time complexity: O(N * sqrt(N))
Efficient approach: Generate all the primes up to the maximum element of the array using the Sieve of Eratosthenes and store them in a hash. Now, traverse the array and check if the number is prime or not. In the end, calculate and print the bitwise AND of the sum of prime numbers and the sum of composite numbers.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int calculateAND( int arr[], int n)
{
int max_val = *max_element(arr, arr + n);
vector< bool > prime(max_val + 1, true );
prime[0] = false ;
prime[1] = false ;
for ( int p = 2; p * p <= max_val; p++) {
if (prime[p] == true ) {
for ( int i = p * 2; i <= max_val; i += p)
prime[i] = false ;
}
}
int S1 = 0, S2 = 0;
for ( int i = 0; i < n; i++) {
if (prime[arr[i]]) {
S1 += arr[i];
}
else if (arr[i] != 1) {
S2 += arr[i];
}
}
return (S1 & S2);
}
int main()
{
int arr[] = { 3, 4, 6, 7 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << calculateAND(arr, n);
return 0;
}
|
Java
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
class GFG
{
static int getMax( int [] A)
{
int max = Integer.MIN_VALUE;
for ( int i: A)
{
max = Math.max(max, i);
}
return max;
}
static int calculateAND( int arr[], int n)
{
int max_val = getMax(arr);
boolean prime[] = new boolean [max_val + 1 ];
int i;
for (i = 0 ; i < max_val + 1 ; i++)
prime[i] = true ;
prime[ 0 ] = false ;
prime[ 1 ] = false ;
for ( int p = 2 ; p * p <= max_val; p++)
{
if (prime[p] == true )
{
for ( i = p * 2 ; i <= max_val; i += p)
prime[i] = false ;
}
}
int S1 = 0 , S2 = 0 ;
for (i = 0 ; i < n; i++)
{
if (prime[arr[i]])
{
S1 += arr[i];
}
else if (arr[i] != 1 )
{
S2 += arr[i];
}
}
return (S1 & S2);
}
public static void main (String[] args)
{
int arr[] = { 3 , 4 , 6 , 7 };
int n = arr.length;
System.out.println(calculateAND(arr, n));
}
}
|
Python3
def calculateAND(arr, n):
max_val = max (arr)
prime = [ True for i in range (max_val + 1 )]
prime[ 0 ] = False
prime[ 1 ] = False
for p in range ( 2 , max_val + 1 ):
if p * p > = max_val:
break
if (prime[p]):
for i in range ( 2 * p, max_val + 1 , p):
prime[i] = False
S1 = 0
S2 = 0
for i in range (n):
if (prime[arr[i]]):
S1 + = arr[i]
elif (arr[i] ! = 1 ):
S2 + = arr[i]
return (S1 & S2)
arr = [ 3 , 4 , 6 , 7 ]
n = len (arr)
print (calculateAND(arr, n))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int getMax( int [] A)
{
int max = int .MinValue;
foreach ( int i in A)
{
max = Math.Max(max, i);
}
return max;
}
static int calculateAND( int []arr, int n)
{
int max_val = getMax(arr);
bool []prime = new bool [max_val + 1];
int i;
for (i = 0; i < max_val + 1; i++)
prime[i] = true ;
prime[0] = false ;
prime[1] = false ;
for ( int p = 2; p * p <= max_val; p++)
{
if (prime[p] == true )
{
for (i = p * 2; i <= max_val; i += p)
prime[i] = false ;
}
}
int S1 = 0, S2 = 0;
for (i = 0; i < n; i++)
{
if (prime[arr[i]])
{
S1 += arr[i];
}
else if (arr[i] != 1)
{
S2 += arr[i];
}
}
return (S1 & S2);
}
public static void Main (String[] args)
{
int []arr = { 3, 4, 6, 7 };
int n = arr.Length;
Console.WriteLine(calculateAND(arr, n));
}
}
|
Javascript
<script>
function calculateAND(arr, n)
{
var max_val = arr.reduce((a,b)=>Math.max(a,b));
var prime = Array(max_val + 1).fill( true );
prime[0] = false ;
prime[1] = false ;
for ( var p = 2; p * p <= max_val; p++) {
if (prime[p] == true ) {
for ( var i = p * 2; i <= max_val; i += p)
prime[i] = false ;
}
}
var S1 = 0, S2 = 0;
for ( var i = 0; i < n; i++) {
if (prime[arr[i]]) {
S1 += arr[i];
}
else if (arr[i] != 1) {
S2 += arr[i];
}
}
return (S1 & S2);
}
var arr = [ 3, 4, 6, 7 ];
var n = arr.length;
document.write( calculateAND(arr, n));
</script>
|
Time Complexity: O(N * log(log(N))
Space Complexity: O(max_val) where max_val is the maximum value of an element in the given array.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...