Absolute difference between the XOR of Non-Prime numbers and Prime numbers of an Array
Last Updated :
16 Nov, 2021
Given an array arr[] of N positive integers, the task is to calculate the absolute difference between XOR of non-prime numbers and prime numbers. Note that 1 is neither prime nor composite.
Examples:
Input: arr[] = {1, 3, 5, 10, 15, 7}
Output: 4
Xor of non-primes = 10 ^ 15 = 5
Xor of primes = 3 ^ 5 ^ 7 = 1
|5 – 1| = 4
Input: arr[] = {3, 4, 6, 7}
Output: 2
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 XOR it to X1 which represents the XOR of primes else XOR it to X2 which represents the XOR of non-primes. After traversing the whole array, take the absolute difference between X1 and X2.
Efficient approach: Generate all primes up to the maximum element of the array using the Sieve of Eratosthenes. Now, traverse the array and check whether the current element is prime or not. If the element is prime then XOR it with X1 else XOR it with X2. Final print abs(X1 – X2).
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int calculateDifference( 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 X1 = 1, X2 = 1;
for ( int i = 0; i < n; i++) {
if (prime[arr[i]]) {
X1 ^= arr[i];
}
else if (arr[i] != 1) {
X2 ^= arr[i];
}
}
return abs (X1 - X2);
}
int main()
{
int arr[] = { 1, 3, 5, 10, 15, 7 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << calculateDifference(arr, n);
return 0;
}
|
Java
import java.util.Arrays;
class GFG
{
static int max_element( int [] arr)
{
int max = arr[ 0 ];
for ( int ele : arr)
if (max < ele)
max = ele;
return max;
}
static int calculateDifference( int [] arr, int n)
{
int max_val = max_element(arr);
boolean [] prime = new boolean [max_val + 1 ];
Arrays.fill(prime, 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 x1 = 1 , x2 = 1 ;
for ( int i = 0 ; i < n; i++)
{
if (prime[arr[i]])
x1 ^= arr[i];
else if (arr[i] != 1 )
x2 ^= arr[i];
}
return Math.abs(x1 - x2);
}
public static void main(String[] args)
{
int [] arr = { 1 , 3 , 5 , 10 , 15 , 7 };
int n = arr.length;
System.out.println(calculateDifference(arr, n));
}
}
|
Python3
def calculateDifference(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 + 1 :
break
if (prime[p] = = True ):
for i in range ( 2 * p, max_val + 1 , p):
prime[i] = False
X1 = 1
X2 = 1
for i in range (n):
if (prime[arr[i]]):
X1 ^ = arr[i]
elif (arr[i] ! = 1 ):
X2 ^ = arr[i]
return abs (X1 - X2)
arr = [ 1 , 3 , 5 , 10 , 15 , 7 ]
n = len (arr)
print (calculateDifference(arr, n))
|
C#
using System;
class GFG
{
static int max_element( int [] arr)
{
int max = arr[0];
foreach ( int ele in arr)
if (max < ele)
max = ele;
return max;
}
static int calculateDifference( int [] arr, int n)
{
int max_val = max_element(arr);
bool [] prime = new bool [max_val + 1];
for ( int index = 0; index < max_val + 1; index++)
prime[index] = 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 x1 = 1, x2 = 1;
for ( int i = 0; i < n; i++)
{
if (prime[arr[i]])
x1 ^= arr[i];
else if (arr[i] != 1)
x2 ^= arr[i];
}
return Math.Abs(x1 - x2);
}
public static void Main(String[] args)
{
int [] arr = { 1, 3, 5, 10, 15, 7 };
int n = arr.Length;
Console.WriteLine(calculateDifference(arr, n));
}
}
|
Javascript
<script>
function calculateDifference(arr, n)
{
let max_val = Math.max(...arr);
let prime = new Array(max_val + 1).fill( true );
prime[0] = false ;
prime[1] = false ;
for (let p = 2; p * p <= max_val; p++)
{
if (prime[p] == true ) {
for (let i = p * 2; i <= max_val; i += p)
prime[i] = false ;
}
}
let X1 = 1, X2 = 1;
for (let i = 0; i < n; i++) {
if (prime[arr[i]]) {
X1 ^= arr[i];
}
else if (arr[i] != 1) {
X2 ^= arr[i];
}
}
return Math.abs(X1 - X2);
}
let arr = [ 1, 3, 5, 10, 15, 7 ];
let n = arr.length;
document.write(calculateDifference(arr, n));
</script>
|
Time Complexity: O(N*log(logN))
Auxiliary Space: O(max_val)
Share your thoughts in the comments
Please Login to comment...