Absolute Difference between the Sum of Non-Prime numbers and Prime numbers of an Array
Last Updated :
10 Apr, 2023
Given an array of positive numbers, the task is to calculate the absolute difference between sum of non-prime numbers and prime numbers.
Note: 1 is neither prime nor non-prime.
Examples:
Input : 1 3 5 10 15 7
Output : 10
Explanation: Sum of non-primes = 25
Sum of primes = 15
Input : 3 4 6 7
Output : 0
Naive Approach: A simple solution is to traverse the array and keep checking for every element if it is prime or not. If number is prime, then add it to sum S2 which represents the sum of primes else check if its not 1 then add it to sum of non-primes let’s say S1. After traversing the whole array, take the absolute difference between the two(S1-S2).
Algorithm:
- Define a function isPrime to check if a number is prime or not
- If n <= 1, return false
- Check if n is divisible by any number between 2 and sqrt(n)
- If n is divisible by i, return false; otherwise, return true
- Define an integer array arr and calculate its length n
- Initialize two integer variables sumOfPrimes and sumOfNonPrimes to 0
- Traverse the array arr from i=0 to i=n-1
- If isPrime(arr[i]) returns true, add arr[i] to the sum of primes (sumOfPrimes += arr[i])
- Else, if arr[i] is not 1, add arr[i] to the sum of non-primes (sumOfNonPrimes += arr[i])
- Calculate the absolute difference between the sum of primes and the sum of non-primes (diff = abs(sumOfPrimes – sumOfNonPrimes))
- Print the absolute difference
Below is the implementation of the approach:
C++
#include <iostream>
#include <cmath>
using namespace std;
bool isPrime( int n) {
if (n <= 1)
return false ;
for ( int i = 2; i <= sqrt (n); i++) {
if (n % i == 0)
return false ;
}
return true ;
}
int main() {
int arr[] = {1 ,3 ,5 ,10 ,15, 7};
int n = sizeof (arr) / sizeof (arr[0]);
int sumOfPrimes = 0, sumOfNonPrimes = 0;
for ( int i = 0; i < n; i++) {
if (isPrime(arr[i]))
sumOfPrimes += arr[i];
else if (arr[i] != 1)
sumOfNonPrimes += arr[i];
}
int diff = abs (sumOfNonPrimes - sumOfPrimes);
cout << diff << endl;
return 0;
}
|
Java
import java.util.*;
public class Main
{
public 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 ;
}
public static void main(String[] args) {
int [] arr = { 1 , 3 , 5 , 10 , 15 , 7 };
int n = arr.length;
int sumOfPrimes = 0 , sumOfNonPrimes = 0 ;
for ( int i = 0 ; i < n; i++) {
if (isPrime(arr[i]))
sumOfPrimes += arr[i];
else if (arr[i] != 1 )
sumOfNonPrimes += arr[i];
}
int diff = Math.abs(sumOfNonPrimes - sumOfPrimes);
System.out.println(diff);
}
}
|
Python3
import math
def is_prime(n):
if n < = 1 :
return False
for i in range ( 2 , int (math.sqrt(n)) + 1 ):
if n % i = = 0 :
return False
return True
arr = [ 1 , 3 , 5 , 10 , 15 , 7 ]
n = len (arr)
sum_of_primes = 0
sum_of_non_primes = 0
for i in range (n):
if is_prime(arr[i]):
sum_of_primes + = arr[i]
elif arr[i] ! = 1 :
sum_of_non_primes + = arr[i]
diff = abs (sum_of_non_primes - sum_of_primes)
print (diff)
|
C#
using System;
namespace PrimeAndNonPrimeSum {
class Program {
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 void Main( string [] args)
{
int [] arr = { 1, 3, 5, 10, 15, 7 };
int n = arr.Length;
int sumOfPrimes = 0, sumOfNonPrimes = 0;
for ( int i = 0; i < n; i++) {
if (IsPrime(arr[i]))
sumOfPrimes
+= arr[i];
else if (arr[i] != 1)
sumOfNonPrimes
+= arr[i];
}
int diff = Math.Abs(sumOfNonPrimes - sumOfPrimes);
Console.WriteLine(diff);
}
}
}
|
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 ;
}
const arr = [1, 3, 5, 10, 15, 7];
const n = arr.length;
let sumOfPrimes = 0,
sumOfNonPrimes = 0;
for (let i = 0; i < n; i++) {
if (isPrime(arr[i])) {
sumOfPrimes += arr[i];
} else if (arr[i] !== 1) {
sumOfNonPrimes += arr[i];
}
}
const diff = Math.abs(sumOfNonPrimes - sumOfPrimes);
console.log(diff);
|
Time complexity: O(N*sqrt(max(arr)))
Space Complexity: O(1)
Efficient Approach: Generate all 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 present in the hash map. Then, add these numbers to sum S2 else check if it’s not 1, then add it to sum S1.
After traversing the whole array, display the absolute difference between the two.
Time Complexity: O(Nlog(log(N))
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 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 abs (S2 - S1);
}
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.*;
class GFG
{
static int CalculateDifference( int arr[],
int n)
{
int max_val = Integer.MIN_VALUE;
for ( int i = 0 ; i < n; i++)
{
if (arr[i] > max_val)
max_val = arr[i];
}
boolean []prime = new boolean [max_val + 1 ];
for ( int i = 0 ; i <= max_val; i++)
prime[i] = 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 Math.abs(S2 - S1);
}
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
import sys
def CalculateDifference(arr, n):
max_val = - 1
for i in range ( 0 , n):
if (arr[i] > max_val):
max_val = arr[i]
prime = [ True for i in range (max_val + 1 )]
prime[ 0 ] = False
prime[ 1 ] = False
p = 2
while (p * p < = max_val):
if prime[p] = = True :
for i in range (p * 2 ,
max_val + 1 , p):
prime[i] = False
p + = 1
S1 = 0
S2 = 0
for i in range ( 0 , n):
if prime[arr[i]]:
S1 + = arr[i]
elif arr[i] ! = 1 :
S2 + = arr[i]
return abs (S2 - S1)
arr = [ 1 , 3 , 5 , 10 , 15 , 7 ]
n = len (arr)
print (CalculateDifference(arr, n))
|
C#
using System;
class GFG
{
static int CalculateDifference( int []arr,
int n)
{
int max_val = int .MinValue;
for ( int i = 0; i < n; i++)
{
if (arr[i] > max_val)
max_val = arr[i];
}
bool []prime = new bool [max_val + 1];
for ( int i = 0; i <= max_val; i++)
prime[i] = 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 Math.Abs(S2 - S1);
}
public static void Main( string []args)
{
int []arr = { 1, 3, 5, 10, 15, 7 };
int n = arr.Length;
Console.WriteLine(CalculateDifference(arr, n));
}
}
|
PHP
<?php
function CalculateDifference( $arr , $n )
{
$max_val = PHP_INT_MIN;
for ( $i = 0; $i < $n ; $i ++)
{
if ( $arr [ $i ] > $max_val )
$max_val = $arr [ $i ];
}
$prime = array_fill (0, $max_val + 1, true);
$prime [0] = false;
$prime [1] = false;
for ( $p = 2; $p * $p <= $max_val ; $p ++)
{
if ( $prime [ $p ] == true)
{
for ( $i = $p * 2;
$i <= $max_val ; $i += $p )
$prime [ $i ] = false;
}
}
$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 abs ( $S2 - $S1 );
}
$arr = array ( 1, 3, 5, 10, 15, 7 );
$n = sizeof( $arr );
echo CalculateDifference( $arr , $n );
?>
|
Javascript
function CalculateDifference(arr) {
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 S1 = 0,
S2 = 0;
for (let i = 0; i < arr.length; i++) {
if (prime[arr[i]]) {
S1 += arr[i];
} else if (arr[i] !== 1) {
S2 += arr[i];
}
}
return Math.abs(S2 - S1);
}
let arr = [1, 3, 5, 10, 15, 7];
console.log(CalculateDifference(arr));
|
Time Complexity: O(n + max_val), where n is the size of the array and max_val is the maximum value in the array.
Auxiliary Space: O(max_val)
Share your thoughts in the comments
Please Login to comment...