Numbers with sum of digits equal to the sum of digits of its all prime factor

13 Jun, 2022
Given a range, the task is to find the count of the numbers in the given range such that the sum of its digit is equal to the sum of all its prime factors digits sum.Examples:  
Input: l = 2, r = 10
Output: 5
2, 3, 4, 5 and 7 are such numbers

Input: l = 15, r = 22
Output: 3
17, 19 and 22 are such numbers
As, 17 and 19 are already prime.
Prime Factors of 22 = 2 * 11 i.e 
For 22, Sum of digits is 2+2 = 4
For 2 * 11, Sum of digits is 2 + 1 + 1 = 4
 
Approach: An efficient solution is to modify Sieve of Eratosthenes such that for each non-prime number it stores smallest prime factor(prefactor).  
Preprocess to find the smallest prime factor for all the numbers between 2 and MAXN. This can be done by breaking up the number into its prime factors in constant time because for each number if it is a prime, it has no prefactor.Otherwise, we can break it up to into a prime factor and the other part of the number which may or may not be prime.And repeat this process of extracting factors till it becomes a prime.Then check if the digits of that number is equal to the digits of prime factors by adding the digits of smallest prime factor i.e
Preprocess to find the smallest prime factor for all the numbers between 2 and MAXN. This can be done by breaking up the number into its prime factors in constant time because for each number if it is a prime, it has no prefactor.
Otherwise, we can break it up to into a prime factor and the other part of the number which may or may not be prime.
And repeat this process of extracting factors till it becomes a prime.
Then check if the digits of that number is equal to the digits of prime factors by adding the digits of smallest prime factor i.e
Digits_Sum of SPF[n] + Digits_Sum of (n / SPF[n])
Now make prefix sum array that counts how many valid numbers are there up to a number N. For each query, print:
Now make prefix sum array that counts how many valid numbers are there up to a number N. For each query, print:
ans[R] – ans[L-1]
Below is the implementation of above approach:  
C++
Java
Python 3
C#
Javascript
// C++ program to Find the count of the numbers// in the given range such that the sum of its// digit is equal to the sum of all its prime// factors digits sum.#include <bits/stdc++.h>using namespace std; // maximum size of number#define MAXN 100005 // array to store smallest prime factor of numberint spf[MAXN] = { 0 }; // array to store sum of digits of a numberint sum_digits[MAXN] = { 0 }; // boolean array to check given number is countable// for required answer or not.bool isValid[MAXN] = { 0 }; // prefix array to store answerint ans[MAXN] = { 0 }; // Calculating SPF (Smallest Prime Factor) for every// number till MAXN.void Smallest_prime_factor(){    // marking smallest prime factor for every    // number to be itself.    for (int i = 1; i < MAXN; i++)        spf[i] = i;     // separately marking spf for every even    // number as 2    for (int i = 4; i < MAXN; i += 2)        spf[i] = 2;     for (int i = 3; i * i <= MAXN; i += 2)         // checking if i is prime        if (spf[i] == i)             // marking SPF for all numbers divisible by i            for (int j = i * i; j < MAXN; j += i)                 // marking spf[j] if it is not                // previously marked                if (spf[j] == j)                    spf[j] = i;} // Function to find sum of digits in a numberint Digit_Sum(int copy){    int d = 0;    while (copy) {        d += copy % 10;        copy /= 10;    }     return d;} // find sum of digits of all numbers up to MAXNvoid Sum_Of_All_Digits(){    for (int n = 2; n < MAXN; n++) {        // add sum of digits of least        // prime factor and n/spf[n]        sum_digits[n] = sum_digits[n / spf[n]]                           + Digit_Sum(spf[n]);         // if it is valid make isValid true        if (Digit_Sum(n) == sum_digits[n])            isValid[n] = true;    }     // prefix sum to compute answer    for (int n = 2; n < MAXN; n++) {        if (isValid[n])            ans[n] = 1;        ans[n] += ans[n - 1];    }} // Driver codeint main(){    Smallest_prime_factor();    Sum_Of_All_Digits();     // decleartion    int l, r;     // print answer for required range    l = 2, r = 3;    cout << "Valid numbers in the range " << l << " "         << r << " are " << ans[r] - ans[l - 1] << endl;     // print answer for required range    l = 2, r = 10;    cout << "Valid numbers in the range " << l << " "         << r << " are " << ans[r] - ans[l - 1] << endl;   return 0;}
// Java program to Find the count// of the numbers in the given// range such that the sum of its// digit is equal to the sum of// all its prime factors digits sum.import java.io.*; class GFG{ // maximum size of numberstatic int MAXN = 100005; // array to store smallest// prime factor of numberstatic int spf[] = new int[MAXN]; // array to store sum// of digits of a numberstatic int sum_digits[] = new int[MAXN]; // boolean array to check// given number is countable// for required answer or not.static boolean isValid[] = new boolean[MAXN]; // prefix array to store answerstatic int ans[] = new int[MAXN]; // Calculating SPF (Smallest// Prime Factor) for every// number till MAXN.static void Smallest_prime_factor(){    // marking smallest prime factor    // for every number to be itself.    for (int i = 1; i < MAXN; i++)        spf[i] = i;     // separately marking spf    // for every even number as 2    for (int i = 4; i < MAXN; i += 2)        spf[i] = 2;     for (int i = 3;             i * i <= MAXN; i += 2)         // checking if i is prime        if (spf[i] == i)             // marking SPF for all            // numbers divisible by i            for (int j = i * i;                     j < MAXN; j += i)                 // marking spf[j] if it                // is not previously marked                if (spf[j] == j)                    spf[j] = i;} // Function to find sum// of digits in a numberstatic int Digit_Sum(int copy){    int d = 0;    while (copy > 0)    {        d += copy % 10;        copy /= 10;    }     return d;} // find sum of digits of// all numbers up to MAXNstatic void Sum_Of_All_Digits(){    for (int n = 2; n < MAXN; n++)    {        // add sum of digits of least        // prime factor and n/spf[n]        sum_digits[n] = sum_digits[n / spf[n]]                          + Digit_Sum(spf[n]);         // if it is valid make isValid true        if (Digit_Sum(n) == sum_digits[n])            isValid[n] = true;    }     // prefix sum to compute answer    for (int n = 2; n < MAXN; n++)    {        if (isValid[n])            ans[n] = 1;        ans[n] += ans[n - 1];    }} // Driver codepublic static void main (String[] args){    Smallest_prime_factor();    Sum_Of_All_Digits();         // declaration    int l, r;         // print answer for required range    l = 2; r = 3;    System.out.println("Valid numbers in the range " +                               l + " " + r + " are " +                              (ans[r] - ans[l - 1] ));         // print answer for required range    l = 2; r = 10;    System.out.println("Valid numbers in the range " +                               l + " " + r + " are " +                               (ans[r] - ans[l - 1]));}} // This code is contributed// by Inder
# Python 3 program to Find the count of# the numbers in the given range such# that the sum of its digit is equal to# the sum of all its prime factors digits sum. # maximum size of numberMAXN = 100005 # array to store smallest prime# factor of numberspf = [0] * MAXN # array to store sum of digits of a numbersum_digits = [0] * MAXN # boolean array to check given number# is countable for required answer or not.isValid = [0] * MAXN # prefix array to store answerans = [0]*MAXN # Calculating SPF (Smallest Prime Factor)# for every number till MAXN.def Smallest_prime_factor():     # marking smallest prime factor    # for every number to be itself.    for i in range(1, MAXN):        spf[i] = i     # separately marking spf for    # every even number as 2    for i in range(4, MAXN, 2):        spf[i] = 2     i = 3    while i * i <= MAXN:         # checking if i is prime        if (spf[i] == i):             # marking SPF for all numbers            # divisible by i            for j in range(i * i, MAXN, i):                 # marking spf[j] if it is not                # previously marked                if (spf[j] == j):                    spf[j] = i                             i += 2 # Function to find sum of digits# in a numberdef Digit_Sum(copy):         d = 0    while (copy) :        d += copy % 10        copy //= 10     return d # find sum of digits of all# numbers up to MAXNdef Sum_Of_All_Digits():     for n in range(2, MAXN) :                 # add sum of digits of least        # prime factor and n/spf[n]        sum_digits[n] = (sum_digits[n // spf[n]] +                         Digit_Sum(spf[n]))         # if it is valid make isValid true        if (Digit_Sum(n) == sum_digits[n]):            isValid[n] = True     # prefix sum to compute answer    for n in range(2, MAXN) :        if (isValid[n]):            ans[n] = 1        ans[n] += ans[n - 1] # Driver codeif __name__ == "__main__":         Smallest_prime_factor()    Sum_Of_All_Digits()     # print answer for required range    l = 2    r = 3    print("Valid numbers in the range", l, r,                  "are", ans[r] - ans[l - 1])     # print answer for required range    l = 2    r = 10    print("Valid numbers in the range", l, r,                  "are", ans[r] - ans[l - 1]) # This code is contributed by ita_c
// C# program to Find the count// of the numbers in the given// range such that the sum of its// digit is equal to the sum of// all its prime factors digits sum.using System; class GFG{ // maximum size of numberstatic int MAXN = 100005; // array to store smallest// prime factor of numberstatic int []spf = new int[MAXN]; // array to store sum// of digits of a numberstatic int []sum_digits = new int[MAXN]; // boolean array to check// given number is countable// for required answer or not.static bool []isValid = new bool[MAXN]; // prefix array to store answerstatic int []ans = new int[MAXN]; // Calculating SPF (Smallest// Prime Factor) for every// number till MAXN.static void Smallest_prime_factor(){    // marking smallest prime factor    // for every number to be itself.    for (int i = 1; i < MAXN; i++)        spf[i] = i;     // separately marking spf    // for every even number as 2    for (int i = 4; i < MAXN; i += 2)        spf[i] = 2;     for (int i = 3;             i * i <= MAXN; i += 2)         // checking if i is prime        if (spf[i] == i)             // marking SPF for all            // numbers divisible by i            for (int j = i * i;                     j < MAXN; j += i)                 // marking spf[j] if it                // is not previously marked                if (spf[j] == j)                    spf[j] = i;} // Function to find sum// of digits in a numberstatic int Digit_Sum(int copy){    int d = 0;    while (copy > 0)    {        d += copy % 10;        copy /= 10;    }     return d;} // find sum of digits of// all numbers up to MAXNstatic void Sum_Of_All_Digits(){    for (int n = 2; n < MAXN; n++)    {        // add sum of digits of least        // prime factor and n/spf[n]        sum_digits[n] = sum_digits[n / spf[n]] +                              Digit_Sum(spf[n]);         // if it is valid make        // isValid true        if (Digit_Sum(n) == sum_digits[n])            isValid[n] = true;    }     // prefix sum to compute answer    for (int n = 2; n < MAXN; n++)    {        if (isValid[n])            ans[n] = 1;        ans[n] += ans[n - 1];    }} // Driver codepublic static void Main (){    Smallest_prime_factor();    Sum_Of_All_Digits();         // declaration    int l, r;         // print answer for required range    l = 2; r = 3;    Console.WriteLine("Valid numbers in the range " +                              l + " " + r + " are " +                             (ans[r] - ans[l - 1] ));         // print answer for required range    l = 2; r = 10;    Console.WriteLine("Valid numbers in the range " +                              l + " " + r + " are " +                              (ans[r] - ans[l - 1]));}} // This code is contributed// by Subhadeep
<script> // Javascript program to Find the count// of the numbers in the given// range such that the sum of its// digit is equal to the sum of// all its prime factors digits sum. // maximum size of numbervar MAXN = 100005; // array to store smallest// prime factor of numbervar spf = Array.from({length: MAXN}, (_, i) => 0); // array to store sum// of digits of a numbervar sum_digits = Array.from({length: MAXN}, (_, i) => 0); // boolean array to check// given number is countable// for required answer or not.var isValid = Array.from({length: MAXN}, (_, i) => false); // prefix array to store answervar ans = Array.from({length: MAXN}, (_, i) => 0); // Calculating SPF (Smallest// Prime Factor) for every// number till MAXN.function Smallest_prime_factor(){    // marking smallest prime factor    // for every number to be itself.    for (i = 1; i < MAXN; i++)        spf[i] = i;     // separately marking spf    // for every even number as 2    for (i = 4; i < MAXN; i += 2)        spf[i] = 2;     for (i = 3;             i * i <= MAXN; i += 2)         // checking if i is prime        if (spf[i] == i)             // marking SPF for all            // numbers divisible by i            for (j = i * i;                     j < MAXN; j += i)                 // marking spf[j] if it                // is not previously marked                if (spf[j] == j)                    spf[j] = i;} // Function to find sum// of digits in a numberfunction Digit_Sum(copy){    var d = 0;    while (copy > 0)    {        d += copy % 10;        copy = parseInt(copy/10);    }     return d;} // find sum of digits of// all numbers up to MAXNfunction Sum_Of_All_Digits(){    for (n = 2; n < MAXN; n++)    {        // add sum of digits of least        // prime factor and n/spf[n]        sum_digits[n] = sum_digits[parseInt(n / spf[n])]                          + Digit_Sum(spf[n]);         // if it is valid make isValid true        if (Digit_Sum(n) == sum_digits[n])            isValid[n] = true;    }     // prefix sum to compute answer    for (n = 2; n < MAXN; n++)    {        if (isValid[n])            ans[n] = 1;        ans[n] += ans[n - 1];    }} // Driver codeSmallest_prime_factor();Sum_Of_All_Digits(); // declarationvar l, r; // print answer for required rangel = 2; r = 3;document.write("Valid numbers in the range " +                           l + " " + r + " are " +                          (ans[r] - ans[l - 1] )); // print answer for required rangel = 2; r = 10;document.write("<br>Valid numbers in the range " +                           l + " " + r + " are " +                           (ans[r] - ans[l - 1]));  // This code contributed by shikhasingrajput </script>
Valid numbers in the range 2 3 are 2
Valid numbers in the range 2 10 are 5
 
inderDuMCA
tufan_gupta2000
ukasp
shikhasingrajput
kothavvsaakash
number-digits
prime-factor
Hash
Mathematical
Hash
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
What is Hashing | A Complete Tutorial
Find k numbers with most occurrences in the given array
Real-time application of Data Structures
Non-Repeating Element
Find the length of largest subarray with 0 sum
Program for Fibonacci numbers
Set in C++ Standard Template Library (STL)
Write a program to print all permutations of a given string
C++ Data Types
Merge two sorted arrays