Find the highest occurring digit in prime numbers in a range
Last Updated :
01 Sep, 2021
Given a range L to R, the task is to find the highest occurring digit in prime numbers lie between L and R (both inclusive). If multiple digits have the same highest frequency print the largest of them. If no prime number occurs between L and R, output -1.
Examples:
Input : L = 1 and R = 20.
Output : 1
Prime number between 1 and 20 are 2, 3, 5, 7, 11, 13, 17, 19.
1 occur maximum i.e 5 times among 0 to 9.
The idea is to start from L to R, check if the number is prime or not. If prime then increment the frequency of digits (using array) present in the prime number. To check if the number is prime or not we can use the Sieve of Eratosthenes.
Below is the implementation of this approach:
C++
#include<bits/stdc++.h>
using namespace std;
void sieve( bool prime[], int n)
{
prime[0] = prime[1] = true ;
for ( int p = 2; p * p <= n; p++)
{
if (prime[p] == false )
for ( int i = p*2; i <= n; i+=p)
prime[i] = true ;
}
}
int maxDigitInPrimes( int L, int R)
{
bool prime[R+1];
memset (prime, 0, sizeof (prime));
sieve(prime, R);
int freq[10] = { 0 };
int val;
for ( int i = L; i <= R; i++)
{
if (!prime[i])
{
int p = i;
while (p)
{
freq[p%10]++;
p /= 10;
}
}
}
int max = freq[0], ans = 0;
for ( int j = 1; j < 10; j++)
{
if (max <= freq[j])
{
max = freq[j];
ans = j;
}
}
return (max != 0)? ans: -1;
}
int main()
{
int L = 1, R = 20;
cout << maxDigitInPrimes(L, R) << endl;
return 0;
}
|
Java
import java.util.Arrays;
class GFG {
static void sieve( boolean prime[], int n) {
for ( int p = 2 ; p * p <= n; p++) {
if (prime[p] == false )
for ( int i = p * 2 ; i <= n; i += p)
prime[i] = true ;
}
}
static int maxDigitInPrimes( int L, int R) {
boolean prime[] = new boolean [R + 1 ];
Arrays.fill(prime, false );
sieve(prime, R);
int freq[] = new int [ 10 ];
int val;
for ( int i = L; i <= R; i++) {
if (!prime[i]) {
int p = i;
while (p > 0 ) {
freq[p % 10 ]++;
p /= 10 ;
}
}
}
int max = freq[ 0 ], ans = 0 ;
for ( int j = 1 ; j < 10 ; j++) {
if (max <= freq[j]) {
max = freq[j];
ans = j;
}
}
return (max != 0 ) ? ans : - 1 ;
}
public static void main(String[] args) {
int L = 1 , R = 20 ;
System.out.println(maxDigitInPrimes(L, R));
}
}
|
Python 3
def sieve(prime, n):
p = 2
while p * p < = n :
if (prime[p] = = False ):
for i in range (p * 2 , n, p):
prime[i] = True
p + = 1
def maxDigitInPrimes(L, R):
prime = [ 0 ] * (R + 1 )
sieve(prime, R)
freq = [ 0 ] * 10
for i in range (L, R + 1 ):
if ( not prime[i]):
p = i
while (p):
freq[p % 10 ] + = 1
p / / = 10
max = freq[ 0 ]
ans = 0
for j in range ( 1 , 10 ):
if ( max < = freq[j]):
max = freq[j]
ans = j
if max = = 0
return - 1
return ans
if __name__ = = "__main__" :
L = 1
R = 20
print (maxDigitInPrimes(L, R))
|
C#
using System;
class GFG {
static void sieve( bool []prime, int n)
{
for ( int p = 2; p * p <= n; p++)
{
if (prime[p] == false )
for ( int i = p * 2; i <= n; i += p)
prime[i] = true ;
}
}
static int maxDigitInPrimes( int L, int R) {
bool []prime = new bool [R + 1];
for ( int i = 0; i < R+1; i++)
prime[i] = false ;
sieve(prime, R);
int []freq = new int [10];
for ( int i = L; i <= R; i++) {
if (!prime[i])
{
int p = i;
while (p > 0) {
freq[p % 10]++;
p /= 10;
}
}
}
int max = freq[0], ans = 0;
for ( int j = 1; j < 10; j++)
{
if (max <= freq[j]) {
max = freq[j];
ans = j;
}
}
return (max != 0) ? ans : -1;
}
public static void Main()
{
int L = 1, R = 20;
Console.Write(maxDigitInPrimes(L, R));
}
}
|
PHP
<?php
function sieve(& $prime , $n )
{
for ( $p = 2; $p * $p <= $n ; $p ++)
{
if ( $prime [ $p ] == false)
for ( $i = $p * 2;
$i <= $n ; $i += $p )
$prime [ $i ] = true;
}
}
function maxDigitInPrimes( $L , $R )
{
$prime = array_fill (0, $R + 1, false);
sieve( $prime , $R );
$freq = array_fill (0, 10, 0);
for ( $i = $L ; $i <= $R ; $i ++)
{
if (! $prime [ $i ])
{
$p = $i ;
while ( $p )
{
$freq [ $p % 10]++;
$p = (int)( $p / 10);
}
}
}
$max = $freq [0];
$ans = 0;
for ( $j = 1; $j < 10; $j ++)
{
if ( $max <= $freq [ $j ])
{
$max = $freq [ $j ];
$ans = $j ;
}
}
return $ans ;
}
$L = 1;
$R = 20;
echo maxDigitInPrimes( $L , $R );
?>
|
Javascript
<script>
function sieve(prime,n)
{
for (let p = 2; p * p <= n; p++) {
if (prime[p] == false )
for (let i = p * 2; i <= n; i += p)
prime[i] = true ;
}
}
function maxDigitInPrimes(L,R)
{
let prime= new Array(R+1);
for (let i=0;i<R+1;i++)
{
prime[i]= false ;
}
sieve(prime, R);
let freq= new Array(10);
for (let i=0;i<10;i++)
{
freq[i]=0;
}
let val;
for (let i = L; i <= R; i++) {
if (!prime[i]) {
let p = i;
while (p > 0) {
freq[p % 10]++;
p = Math.floor(p/10);
}
}
}
let max = freq[0], ans = 0;
for (let j = 1; j < 10; j++) {
if (max <= freq[j]) {
max = freq[j];
ans = j;
}
}
return ans;
}
let L = 1, R = 20;
document.write(maxDigitInPrimes(L, R));
</script>
|
Output:
1
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...