Non-repeating Primes
Last Updated :
28 Sep, 2022
Given an array arr[] containing repetitive prime and nonprime numbers, the task is to find the prime numbers occurring only once.
Examples:
Input: arr[] = {2, 3, 4, 6, 7, 9, 7, 23, 21, 2, 3}
Output: 23
Explanation:
In the given array, 23 is the only prime number which appears once.
Input: arr[] = {17, 19, 7, 5, 29, 5, 2, 2, 7, 17, 19}
Output: 29
Explanation:
In the given array, 29 is the only prime number which appears once.
Naive Approach: To solve the problem mentioned above the solution is to check every element if it is prime. If it is prime, then check is it appears only once or not. Once a prime element with a single occurrence is found, print it.
Time complexity: O(N2)
Efficient Approach: The above approach can be further optimised using Sieve and Hashing algorithm.
- Precompute and store prime numbers using Sieve in a Hash Table.
- Also create a HashMap to store the numbers with their frequency.
- Traverse all elements in the array one by one and:
- Check if the current number is prime or not, using the Sieve Hash Table in O(1).
- If the number is prime, then increase its frequency in the HashMap.
- Traverse the HashMap, and print all the numbers which have the frequency 1.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
vector< bool > findPrimes( 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 ;
}
}
return prime;
}
void nonRepeatingPrimes( int arr[], int n)
{
vector< bool > prime = findPrimes(arr, n);
map< int , int > mp ;
for ( int i = 0; i < n; i++)
{
if (prime[arr[i]])
mp[arr[i]]++;
}
for ( auto entry : mp)
{
if (entry.second == 1)
cout << entry.first << endl;
}
}
int main()
{
int arr[] = { 2, 3, 4, 6, 7, 9,
7, 23, 21, 3 };
int n = sizeof (arr) / sizeof (arr[0]);
nonRepeatingPrimes(arr, n);
}
|
Java
import java.util.*;
class GFG {
static Vector<Boolean> findPrimes(
int arr[], int n)
{
int max_val = Arrays
.stream(arr)
.max()
.getAsInt();
Vector<Boolean> prime
= new Vector<>(max_val + 1 );
for ( int i = 0 ; i < max_val + 1 ; i++)
prime.add(i, Boolean.TRUE);
prime.add( 0 , Boolean.FALSE);
prime.add( 1 , Boolean.FALSE);
for ( int p = 2 ; p * p <= max_val; p++) {
if (prime.get(p) == true ) {
for ( int i = p * 2 ;
i <= max_val;
i += p)
prime.add(i, Boolean.FALSE);
}
}
return prime;
}
static void nonRepeatingPrimes(
int arr[], int n)
{
Vector<Boolean> prime
= findPrimes(arr, n);
HashMap<Integer, Integer> mp
= new HashMap<>();
for ( int i = 0 ; i < n; i++) {
if (prime.get(arr[i]))
if (mp.containsKey(arr[i]))
mp.put(arr[i],
mp.get(arr[i]) + 1 );
else
mp.put(arr[i], 1 );
}
for (Map.Entry<Integer, Integer>
entry : mp.entrySet()) {
if (entry.getValue() == 1 )
System.out.println(
entry.getKey());
}
}
public static void main(String[] args)
{
int arr[] = { 2 , 3 , 4 , 6 , 7 , 9 ,
7 , 23 , 21 , 3 };
int n = arr.length;
nonRepeatingPrimes(arr, n);
}
}
|
Python3
def findPrimes( arr, n):
max_val = max (arr)
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
return prime;
def nonRepeatingPrimes(arr, n):
prime = findPrimes(arr, n);
mp = dict ()
for i in range (n):
if (prime[arr[i]]):
if (arr[i] in mp):
mp[arr[i]] + = 1
else :
mp[arr[i]] = 1
for entry in mp.keys():
if (mp[entry] = = 1 ):
print (entry);
if __name__ = = '__main__' :
arr = [ 2 , 3 , 4 , 6 , 7 , 9 , 7 , 23 , 21 , 3 ]
n = len (arr)
nonRepeatingPrimes(arr, n);
|
C#
using System;
using System.Collections;
using System.Linq;
using System.Collections.Generic;
class GFG{
static List< bool > findPrimes( int []arr, int n)
{
int max_val = arr.Max();
List< bool > prime = new List< bool >(max_val + 1);
for ( int i = 0; i < max_val + 1; i++)
prime.Add( 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 ;
}
}
return prime;
}
static void nonRepeatingPrimes( int []arr, int n)
{
List< bool > prime = findPrimes(arr, n);
Dictionary< int ,
int > mp = new Dictionary< int ,
int >();
for ( int i = 0; i < n; i++)
{
if (prime[arr[i]])
if (mp.ContainsKey(arr[i]))
mp[arr[i]]++;
else
mp.Add(arr[i], 1);
}
foreach (KeyValuePair< int , int > entry in mp)
{
if (entry.Value == 1)
Console.WriteLine(entry.Key);
}
}
public static void Main( string [] args)
{
int []arr = { 2, 3, 4, 6, 7, 9,
7, 23, 21, 3 };
int n = arr.Length;
nonRepeatingPrimes(arr, n);
}
}
|
Javascript
<script>
function findPrimes(arr, n){
let max_val = Math.max(...arr)
let prime = new Array(max_val + 1).fill( true );
prime[0] = false
prime[1] = false
let p = 2
while (p * p <= max_val){
if (prime[p] == true ){
for (let i = p * 2; i< max_val + 1; i += p)
prime[i] = false
}
p += 1
}
return prime
}
function nonRepeatingPrimes(arr, n){
let prime = findPrimes(arr, n);
let mp = new Map();
for (let i=0;i<n;i++){
if (prime[arr[i]]){
if (mp.has(arr[i]))
mp.set(arr[i], mp.get(arr[i])+1)
else
mp.set(arr[i],1)
}
}
for (let [key,value] of mp){
if (value == 1)
document.write(key, "</br>" );
}
}
let arr = [2, 3, 4, 6, 7, 9, 7, 23, 21, 3]
let n = arr.length
nonRepeatingPrimes(arr, n)
</script>
|
Time complexity: O(O(n*log(log(n))))
Auxiliary Space: O(K), where K is the largest value in the array.
Share your thoughts in the comments
Please Login to comment...