📜  在一个范围内的质数中找到出现次数最高的数字

📅  最后修改于: 2021-05-08 16:18:18             🧑  作者: Mango

给定范围为LR ,任务是找到位于L和R(包括两端)之间的质数中出现最高的数字。如果多个数字具有相同的最高频率,请打印最大的数字。如果L和R之间没有质数,则输出-1。
例子:

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.

这个想法是从L到R开始,检查数字是否为质数。如果为质数,则增加质数中存在的数字的频率(使用数组)。要检查数字是否为质数,我们可以使用Eratosthenes筛。
以下是此方法的实现:

C++
// C++ program to find the highest occurring digit
// in prime numbers in a range L to R.
#include
using namespace std;
 
// Sieve of Eratosthenes
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;
    }
}
 
// Returns maximum occurring digits in primes
// from l to r.
int maxDigitInPrimes(int L, int R)
{
    bool prime[R+1];
    memset(prime, 0, sizeof(prime));
 
    // Finding the prime number up to R.
    sieve(prime, R);
 
    // Initialse frequency of all digit to 0.
    int freq[10] = { 0 };
    int val;
 
    // For all number between L to R, check if prime
    // or not. If prime, incrementing the frequency
    // of digits present in the prime number.
    for (int i = L; i <= R; i++)
    {
        if (!prime[i])
        {
            int p = i; // If i is prime
            while (p)
            {
                freq[p%10]++;
                p /= 10;
            }
        }
    }
 
    // Finding digit with highest frequency.
    int max = freq[0], ans = 0;
    for (int j = 1; j < 10; j++)
    {
        if (max <= freq[j])
        {
            max = freq[j];
            ans = j;
        }
    }
 
    return ans;
}
 
// Driven Program
int main()
{
    int L = 1, R = 20;
 
    cout << maxDigitInPrimes(L, R) << endl;
    return 0;
}


Java
// Java program to find the highest occurring digit
// in prime numbers in a range L to R.
import java.util.Arrays;
 
class GFG {
     
    // Sieve of Eratosthenes
    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;
        }
    }
     
    // Returns maximum occurring digits in primes
    // from l to r.
    static int maxDigitInPrimes(int L, int R) {
 
        boolean prime[] = new boolean[R + 1];
        Arrays.fill(prime, false);
     
        // Finding the prime number up to R.
        sieve(prime, R);
     
        // Initialse frequency of all digit to 0.
        int freq[] = new int[10];
        int val;
     
        // For all number between L to R, check if
        // prime or not. If prime, incrementing
        // the frequency of digits present in the
        // prime number.
        for (int i = L; i <= R; i++) {
 
            if (!prime[i]) {
                int p = i; // If i is prime
 
                while (p > 0) {
                freq[p % 10]++;
                p /= 10;
                }
            }
        }
     
        // Finding digit with highest frequency.
        int max = freq[0], ans = 0;
 
        for (int j = 1; j < 10; j++) {
            if (max <= freq[j]) {
                max = freq[j];
                ans = j;
            }
        }
     
        return ans;
    }
     
    // Driver code
    public static void main(String[] args) {
        int L = 1, R = 20;
        System.out.println(maxDigitInPrimes(L, R));
    }
}
 
// This code is contributed by Anant Agarwal.


Python 3
# Python 3 program to find the highest
# occurring digit in prime numbers
# in a range L to R.
 
# Sieve of Eratosthenes
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
 
# Returns maximum occurring digits
# in primes from l to r.
def maxDigitInPrimes(L, R):
 
    prime = [0] * (R + 1)
 
    # Finding the prime number up to R.
    sieve(prime, R)
 
    # Initialse frequency of all
    # digit to 0.
    freq = [0] * 10
 
    # For all number between L to R,
    # check if prime or not. If prime,
    # incrementing the frequency
    # of digits present in the prime number.
    for i in range(L, R + 1):
        if (not prime[i]):
            p = i # If i is prime
            while (p):
                freq[p % 10] += 1
                p //= 10
 
    # Finding digit with highest frequency.
    max = freq[0]
    ans = 0
    for j in range(1, 10):
        if (max <= freq[j]):
            max = freq[j]
            ans = j
 
    return ans
 
# Driver Code
if __name__=="__main__":
     
    L = 1
    R = 20
 
    print(maxDigitInPrimes(L, R))
 
# This code is contributed by ita_c


C#
// C# program to find the highest
// occurring digit in prime numbers
// in a range L to R.
using System;
 
class GFG {
     
    // Sieve of Eratosthenes
    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;
        }
    }
     
    // Returns maximum occurring digits
    // in primes from l to r.
    static int maxDigitInPrimes(int L, int R) {
 
        bool []prime = new bool[R + 1];
        for(int i = 0; i < R+1; i++)
        prime[i] = false;
 
        // Finding the prime number up to R.
        sieve(prime, R);
     
        // Initialse frequency of all digit to 0.
        int []freq = new int[10];
     
     
        // For all number between L to R, check if
        // prime or not. If prime, incrementing
        // the frequency of digits present in the
        // prime number.
        for (int i = L; i <= R; i++) {
 
            if (!prime[i])
            {
                int p = i; // If i is prime
 
                while (p > 0) {
                freq[p % 10]++;
                p /= 10;
                }
            }
        }
     
        // Finding digit with highest frequency.
        int max = freq[0], ans = 0;
 
        for (int j = 1; j < 10; j++)
        {
            if (max <= freq[j]) {
                max = freq[j];
                ans = j;
            }
        }
        return ans;
    }
     
    // Driver code
    public static void Main()
    {
        int L = 1, R = 20;
        Console.Write(maxDigitInPrimes(L, R));
    }
}
 
// This code is contributed by nitin mittal.


PHP


Javascript


输出:

1