Find prime number K in an array such that (A[i] % K) is maximum
Given an array arr[] of n integers. The task is to find an element from the array K such that
- K is prime.
- And, arr[i] % K is the maximum for all valid i among all possible values of K
if there is no prime number in the array then print -1.
Examples:
Input: arr[] = {2, 10, 15, 7, 6, 8, 13}
Output: 13
2, 7 and 13 are the only prime numbers in the array.
The maximum possible value of arr[i] % 2 is 1 i.e. 15 % 2 = 1.
For 7, it is 6 % 7 = 6
For 13, 10 % 13 = 10 (Maximum possible)
Input: arr[] = {23, 13, 6, 2, 15, 18, 8}
Output: 23
Approach: In order to maximize the value of arr[i] % K, K must be the maximum prime number from the array and arr[i] must be the greatest element from the array which is less than K. So, the problem now gets reduced to finding the maximum prime number from the array. In order to do that,
- First, find all the prime numbers less than or equal to the maximum element from the array using Sieve.
- Then, find the maximum prime number from the array and print it. If there is no prime present in the array then print -1.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int getPrime( 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 maximum = -1;
for ( int i = 0; i < n; i++) {
if (prime[arr[i]])
maximum = max(maximum, arr[i]);
}
return maximum;
}
int main()
{
int arr[] = { 2, 10, 15, 7, 6, 8, 13 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << getPrime(arr, n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int getPrime( 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( 1 ,Boolean.FALSE);
prime.add( 2 ,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);
}
}
int maximum = - 1 ;
for ( int i = 0 ; i < n; i++)
{
if (prime.get(arr[i]))
{
maximum = Math.max(maximum, arr[i]);
}
}
return maximum;
}
public static void main(String[] args)
{
int arr[] = { 2 , 10 , 15 , 7 , 6 , 8 , 13 };
int n = arr.length;
System.out.println(getPrime(arr, n));
}
}
|
Python3
from math import sqrt
def getPrime(arr, n):
max_val = arr[ 0 ]
for i in range ( len (arr)):
if (arr[i] > max_val):
max_val = arr[i]
prime = [ True for i in range (max_val + 1 )]
prime[ 0 ] = False
prime[ 1 ] = False
for p in range ( 2 , int (sqrt(max_val)) + 1 , 1 ):
if (prime[p] = = True ):
for i in range (p * 2 , max_val + 1 , p):
prime[i] = False
maximum = - 1
for i in range (n):
if (prime[arr[i]]):
maximum = max (maximum, arr[i])
return maximum
if __name__ = = '__main__' :
arr = [ 2 , 10 , 15 , 7 , 6 , 8 , 13 ]
n = len (arr)
print (getPrime(arr, n))
|
C#
using System;
using System.Linq;
using System.Collections.Generic;
class GFG
{
static int getPrime( int []arr, int n)
{
int max_val = arr.Max();
List<Boolean> prime = new List<Boolean>(max_val + 1);
for ( int i = 0; i < max_val + 1; i++)
prime.Insert(i, true );
prime.Insert(1, false );
prime.Insert(2, 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.Insert(i, false );
}
}
int maximum = -1;
for ( int i = 0; i < n; i++)
{
if (prime[arr[i]])
{
maximum = Math.Max(maximum, arr[i]);
}
}
return maximum;
}
public static void Main(String[] args)
{
int []arr = { 2, 10, 15, 7, 6, 8, 13 };
int n = arr.Length;
Console.WriteLine(getPrime(arr, n));
}
}
|
PHP
<?php
function getPrime( $arr , $n )
{
$max_val = max( $arr );
$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;
}
}
$maximum = -1;
for ( $i = 0; $i < $n ; $i ++)
{
if ( $prime [ $arr [ $i ]])
$maximum = max( $maximum , $arr [ $i ]);
}
return $maximum ;
}
$arr = array ( 2, 10, 15, 7, 6, 8, 13 );
$n = count ( $arr ) ;
echo getPrime( $arr , $n );
?>
|
Javascript
<script>
function getPrime(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 maximum = -1;
for (let i = 0; i < n; i++) {
if (prime[arr[i]])
maximum = Math.max(maximum, arr[i]);
}
return maximum;
}
let arr = [ 2, 10, 15, 7, 6, 8, 13 ];
let n = arr.length;
document.write(getPrime(arr, n));
</script>
|
Time Complexity: O(n + max), where max is the largest element of the array.
Auxiliary Space: O(max), where max is the maximum element of the array.
Last Updated :
31 May, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...