Count all prime numbers in a given range whose sum of digits is also prime - GeeksforGeeks

24 Feb, 2022
Given two integers L and R, the task is to find the count of total numbers of prime numbers in the range [L, R] whose sum of the digits is also a prime number.
Examples:
Input: L = 1, R = 10 Output: 4 Explanation: Prime numbers in the range L = 1 to R = 10 are {2, 3, 5, 7}. Their sum of digits is {2, 3, 5, 7}. Since all the numbers are prime, hence the answer to the query is 4.Input: L = 5, R = 20 Output: 3 Explanation: Prime numbers in the range L = 5 to R = 20 are {5, 7, 11, 13, 17, 19}.1 Their sum of digits is {5, 7, 2, 4, 8, 10}. Only {5, 7, 2} are prime, hence the answer to the query is 3.
Naive Approach: The naive approach is to iterate for each number in the range [L, R] and check if the number is prime or not. If the number is prime, find the sum of its digits and again check whether the sum is prime or not. If the sum is prime, then increment the counter for the current element in the range [L, R].Time Complexity: O((R – L)*log(log P)) where P is the prime number in the range [L, R].
Efficient Approach:
Store all the prime numbers ranging from 1 to 106 in an array using Sieve of Eratosthenes.Create another array that will store whether the sum of the digits of all the numbers ranging from 1 to 106 which are prime.Now, compute a prefix array to store counts till every value before the limit.Once we have a prefix array, the value of prefix[R] – prefix[L-1] gives the count of elements in the given range that are prime and whose sum is also prime.
Store all the prime numbers ranging from 1 to 106 in an array using Sieve of Eratosthenes.
Create another array that will store whether the sum of the digits of all the numbers ranging from 1 to 106 which are prime.
Now, compute a prefix array to store counts till every value before the limit.
Once we have a prefix array, the value of prefix[R] – prefix[L-1] gives the count of elements in the given range that are prime and whose sum is also prime.
Below is the implementation of the above approach:
C++
Java
Python3
C#
Javascript
// C++ program for the above approach #include <bits/stdc++.h>using namespace std; int maxN = 1000000; // Create an array for storing primesint arr[1000001]; // Create a prefix array that will// contain whether sum is prime or notint prefix[1000001]; // Function to find primes in the range// and check whether the sum of digits// of a prime number is prime or notvoid findPrimes(){    // Initialise Prime array arr[]    for (int i = 1; i <= maxN; i++)        arr[i] = 1;     // Since 0 and 1 are not prime    // numbers we mark them as '0'    arr[0] = 0, arr[1] = 0;     // Using Sieve Of Eratosthenes    for (int i = 2; i * i <= maxN; i++) {         // if the number is prime        if (arr[i] == 1) {             // Mark all the multiples            // of i starting from square            // of i with '0' ie. composite            for (int j = i * i;                 j <= maxN; j += i) {                 //'0' represents not prime                arr[j] = 0;            }        }    }     // Initialise a sum variable as 0    int sum = 0;    prefix[0] = 0;     for (int i = 1; i <= maxN; i++) {         // Check if the number is prime        if (arr[i] == 1) {             // A temporary variable to            // store the number            int temp = i;            sum = 0;             // Loop to calculate the            // sum of digits            while (temp > 0) {                int x = temp % 10;                sum += x;                temp = temp / 10;                 // Check if the sum of prime                // number is prime                if (arr[sum] == 1) {                     // if prime mark 1                    prefix[i] = 1;                }                 else {                     // If not prime mark 0                    prefix[i] = 0;                }            }        }    }     // computing prefix array    for (int i = 1; i <= maxN; i++) {        prefix[i]            += prefix[i - 1];    }} // Function to count the prime numbers// in the range [L, R]void countNumbersInRange(int l, int r){    // Function Call to find primes    findPrimes();    int result = prefix[r]                 - prefix[l - 1];     // Print the result    cout << result << endl;} // Driver Codeint main(){    // Input range    int l, r;    l = 5, r = 20;     // Function Call    countNumbersInRange(l, r);    return 0;}
// Java program for the above approachclass GFG{ static int maxN = 1000000; // Create an array for storing primesstatic int []arr = new int[1000001]; // Create a prefix array that will// contain whether sum is prime or notstatic int []prefix = new int[1000001]; // Function to find primes in the range// and check whether the sum of digits// of a prime number is prime or notstatic void findPrimes(){    // Initialise Prime array arr[]    for (int i = 1; i <= maxN; i++)        arr[i] = 1;     // Since 0 and 1 are not prime    // numbers we mark them as '0'    arr[0] = 0;    arr[1] = 0;     // Using Sieve Of Eratosthenes    for (int i = 2; i * i <= maxN; i++)    {         // if the number is prime        if (arr[i] == 1)        {             // Mark all the multiples            // of i starting from square            // of i with '0' ie. composite            for (int j = i * i;                     j <= maxN; j += i)            {                 //'0' represents not prime                arr[j] = 0;            }        }    }     // Initialise a sum variable as 0    int sum = 0;    prefix[0] = 0;     for (int i = 1; i <= maxN; i++)    {         // Check if the number is prime        if (arr[i] == 1)        {             // A temporary variable to            // store the number            int temp = i;            sum = 0;             // Loop to calculate the            // sum of digits            while (temp > 0)            {                int x = temp % 10;                sum += x;                temp = temp / 10;                 // Check if the sum of prime                // number is prime                if (arr[sum] == 1)                {                     // if prime mark 1                    prefix[i] = 1;                }                 else                {                     // If not prime mark 0                    prefix[i] = 0;                }            }        }    }     // computing prefix array    for (int i = 1; i <= maxN; i++)    {        prefix[i] += prefix[i - 1];    }} // Function to count the prime numbers// in the range [L, R]static void countNumbersInRange(int l, int r){    // Function Call to find primes    findPrimes();    int result = prefix[r] - prefix[l - 1];     // Print the result    System.out.print(result + "\n");} // Driver Codepublic static void main(String[] args){    // Input range    int l, r;    l = 5;    r = 20;     // Function Call    countNumbersInRange(l, r);}} // This code is contributed by sapnasingh4991
# Python3 program for the above approachmaxN = 1000000 # Create an array for storing primesarr = [0] * (1000001) # Create a prefix array that will# contain whether sum is prime or notprefix = [0] * (1000001) # Function to find primes in the range# and check whether the sum of digits# of a prime number is prime or notdef findPrimes():     # Initialise Prime array arr[]    for i in range(1, maxN + 1):        arr[i] = 1     # Since 0 and 1 are not prime    # numbers we mark them as '0'    arr[0] = 0    arr[1] = 0     # Using Sieve Of Eratosthenes    i = 2    while i * i <= maxN:         # If the number is prime        if (arr[i] == 1):             # Mark all the multiples            # of i starting from square            # of i with '0' ie. composite            for j in range(i * i, maxN, i):                 # '0' represents not prime                arr[j] = 0         i += 1     # Initialise a sum variable as 0    sum = 0    prefix[0] = 0     for i in range(1, maxN + 1):         # Check if the number is prime        if (arr[i] == 1):             # A temporary variable to            # store the number            temp = i            sum = 0             # Loop to calculate the            # sum of digits            while (temp > 0):                x = temp % 10                sum += x                temp = temp // 10                 # Check if the sum of prime                # number is prime                if (arr[sum] == 1):                     # If prime mark 1                    prefix[i] = 1                 else:                                         # If not prime mark 0                    prefix[i] = 0     # Computing prefix array    for i in range(1, maxN + 1):        prefix[i] += prefix[i - 1] # Function to count the prime numbers# in the range [L, R]def countNumbersInRange(l, r):     # Function call to find primes    findPrimes()    result = (prefix[r] - prefix[l - 1])     # Print the result    print(result) # Driver Codeif __name__ == "__main__":     # Input range    l = 5    r = 20     # Function call    countNumbersInRange(l, r) # This code is contributed by chitranayal
// C# program for the above approachusing System;class GFG{ static int maxN = 1000000; // Create an array for storing primesstatic int []arr = new int[1000001]; // Create a prefix array that will// contain whether sum is prime or notstatic int []prefix = new int[1000001]; // Function to find primes in the range// and check whether the sum of digits// of a prime number is prime or notstatic void findPrimes(){    // Initialise Prime array arr[]    for (int i = 1; i <= maxN; i++)        arr[i] = 1;     // Since 0 and 1 are not prime    // numbers we mark them as '0'    arr[0] = 0;    arr[1] = 0;     // Using Sieve Of Eratosthenes    for (int i = 2; i * i <= maxN; i++)    {         // if the number is prime        if (arr[i] == 1)        {             // Mark all the multiples            // of i starting from square            // of i with '0' ie. composite            for (int j = i * i;                     j <= maxN; j += i)            {                 //'0' represents not prime                arr[j] = 0;            }        }    }     // Initialise a sum variable as 0    int sum = 0;    prefix[0] = 0;     for (int i = 1; i <= maxN; i++)    {         // Check if the number is prime        if (arr[i] == 1)        {             // A temporary variable to            // store the number            int temp = i;            sum = 0;             // Loop to calculate the            // sum of digits            while (temp > 0)            {                int x = temp % 10;                sum += x;                temp = temp / 10;                 // Check if the sum of prime                // number is prime                if (arr[sum] == 1)                {                     // if prime mark 1                    prefix[i] = 1;                }                 else                {                     // If not prime mark 0                    prefix[i] = 0;                }            }        }    }     // computing prefix array    for (int i = 1; i <= maxN; i++)    {        prefix[i] += prefix[i - 1];    }} // Function to count the prime numbers// in the range [L, R]static void countNumbersInRange(int l, int r){    // Function Call to find primes    findPrimes();    int result = prefix[r] - prefix[l - 1];     // Print the result    Console.Write(result + "\n");} // Driver Codepublic static void Main(){    // Input range    int l, r;    l = 5;    r = 20;     // Function Call    countNumbersInRange(l, r);}} // This code is contributed by Code_Mech
<script>// Javascript implementation for the above approach let maxN = 1000000; // Create an array for storing primeslet arr = Array.from({length: 1000001}, (_, i) => 0);// Create a prefix array that will// contain whether sum is prime or notlet prefix = Array.from({length: 1000001}, (_, i) => 0); // Function to find primes in the range// and check whether the sum of digits// of a prime number is prime or notfunction findPrimes(){    // Initialise Prime array arr[]    for (let i = 1; i <= maxN; i++)        arr[i] = 1;     // Since 0 and 1 are not prime    // numbers we mark them as '0'    arr[0] = 0;    arr[1] = 0;     // Using Sieve Of Eratosthenes    for (let i = 2; i * i <= maxN; i++)    {         // if the number is prime        if (arr[i] == 1)        {             // Mark all the multiples            // of i starting from square            // of i with '0' ie. composite            for (let j = i * i;                     j <= maxN; j += i)            {                 //'0' represents not prime                arr[j] = 0;            }        }    }     // Initialise a sum variable as 0    let sum = 0;    prefix[0] = 0;     for (let i = 1; i <= maxN; i++)    {         // Check if the number is prime        if (arr[i] == 1)        {             // A temporary variable to            // store the number            let temp = i;            sum = 0;             // Loop to calculate the            // sum of digits            while (temp > 0)            {                let x = temp % 10;                sum += x;                temp = Math.floor(temp / 10);                 // Check if the sum of prime                // number is prime                if (arr[sum] == 1)                {                     // if prime mark 1                    prefix[i] = 1;                }                 else                {                     // If not prime mark 0                    prefix[i] = 0;                }            }        }    }     // computing prefix array    for (let i = 1; i <= maxN; i++)    {        prefix[i] += prefix[i - 1];    }} // Function to count the prime numbers// in the range [L, R]function countNumbersInRange(l, r){    // Function Call to find primes    findPrimes();    let result = prefix[r] - prefix[l - 1];     // Print the result    document.write(result + "\n");}     // Driver Code          // Input range    let l, r;    l = 5;    r = 20;     // Function Call    countNumbersInRange(l, r);         </script>
3
 
Time Complexity: O(N*(log(log)N))Auxiliary Space: O(N) 
sapnasingh4991
Code_Mech
ukasp
jyoti369
sanjoy_62
sooda367
arorakashish0911
number-digits
number-theory
Prime Number
sieve
Competitive Programming
Mathematical
number-theory
Mathematical
Prime Number
sieve
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Prefix Sum Array - Implementation and Applications in Competitive Programming
Ordered Set and GNU C++ PBDS
Bits manipulation (Important tactics)
What is Competitive Programming and How to Prepare for It?
7 Best Coding Challenge Websites in 2020
Program for Fibonacci numbers
Write a program to print all permutations of a given string
C++ Data Types
Set in C++ Standard Template Library (STL)
Coin Change | DP-7