Count numbers from 1 to n that have 4 as a digit

Given a number n, find count of all numbers from 1 to n that have 4 as a digit.

Examples:

Input:   n = 5
Output:  1
Only 4 has '4' as digit

Input:   n = 50
Output:  14

Input:   n = 328
Output:  60

This problem is mainly a variation of previous article on Compute sum of digits in all numbers from 1 to n.



Naive Solution:
A naive solution is to go through every number x from 1 to n, and check if x has 4. To check if x has or not, we can traverse all digits of x. Below is the implementation of above idea :

C++

// A Simple C++ program to compute sum of digits in numbers from 1 to n
#include<iostream>
using namespace std;

bool has4(int x);

// Returns sum of all digits in numbers from 1 to n
int countNumbersWith4(int n)
{
    int result = 0; // initialize result

    // One by one compute sum of digits in every number from
    // 1 to n
    for (int x=1; x<=n; x++)
        result += has4(x)? 1 : 0;

    return result;
}

// A utility function to compute sum of digits in a
// given number x
bool has4(int x)
{
    while (x != 0)
    {
        if (x%10 == 4)
           return true;
        x   = x /10;
    }
    return false;
}

// Driver Program
int main()
{
   int n = 328;
   cout << "Count of numbers from 1 to " << n 
        << " that have 4 as a a digit is " 
        << countNumbersWith4(n) << endl;
   return 0;
}

Java

// Java program to compute sum of
// digits in numbers from 1 to n
import java.io.*;

class GFG {
    
    // Returns sum of all digits
    // in numbers from 1 to n
    static int countNumbersWith4(int n)
    {
        // initialize result
        int result = 0;
     
        // One by one compute sum of digits
        // in every number from 1 to n
        for (int x=1; x<=n; x++)
            result += has4(x)? 1 : 0;
     
        return result;
    }
    
    // A utility function to compute sum
    // of digits in a given number x
    static boolean has4(int x)
    {
        while (x != 0)
        {
            if (x%10 == 4)
               return true;
            x   = x /10;
        }
        return false;
    }
     
    // Driver Program
    public static void main(String args[])
    {
       int n = 328;
       System.out.println("Count of numbers from 1 to "
                          + " that have 4 as a a digit is "
                          + countNumbersWith4(n)) ;
    }
}

// This code is contributed by Nikita Tiwari.

Python

# A Simple Python 3 program to compute
# sum of digits in numbers from 1 to n

# Returns sum of all digits in numbers from 1 to n
def countNumbersWith4(n) :
    result = 0 # initialize result

    # One by one compute sum of digits
    # in every number from 1 to n
    for x in range(1, n + 1) :
        if(has4(x) == True) :
            result = result + 1

    return result

# A utility function to compute sum  
# of digits in a given number x
def has4(x) :
    while (x != 0) :
        if (x%10 == 4) :
            return True
        x = x //10
    
    return False
    
# Driver Program
n = 328
print ("Count of numbers from 1 to ", n,
        " that have 4 as a a digit is ", 
                    countNumbersWith4(n)) 


# This code is contributed by Nikita Tiwari.

C#

// C# program to compute sum of
// digits in numbers from 1 to n
using System;

public class GFG 
{
    
    // Returns sum of all digits
    // in numbers from 1 to n
    static int countNumbersWith4(int n)
    {
        
        // initialize result
        int result = 0;
    
        // One by one compute sum of digits
        // in every number from 1 to n
        for (int x = 1; x <= n; x++)
            result += has4(x) ? 1 : 0;
    
        return result;
    }
    
    // A utility function to compute sum
    // of digits in a given number x
    static bool has4(int x)
    {
        while (x != 0)
        {
            if (x % 10 == 4)
            return true;
            x = x / 10;
        }
        return false;
    }
    
    // Driver Code
    public static void Main()
    {
        int n = 328;
        Console.WriteLine("Count of numbers from 1 to "
                        + " that have 4 as a a digit is "
                        + countNumbersWith4(n)) ;
    }
}

// This code is contributed by Sam007 


Output:
Count of numbers from 1 to 328 that have 4 as a a digit is 60



Efficient Solution:
Above is a naive solution. We can do it more efficiently by finding a pattern.
Let us take few examples.

Count of numbers from 0 to 9   = 1
Count of numbers from 0 to 99  = 1*9 + 10 = 19
Count of numbers from 0 to 999 = 19*9 + 100 = 271 

In general, we can write 
   count(10d) =   9 * count(10d - 1) + 10d - 1

In below implementation, the above formula is implemented using dynamic programming as there are overlapping subproblems.
The above formula is one core step of the idea. Below is complete algorithm.

1) Find number of digits minus one in n. Let this value be 'd'.  
   For 328, d is 2.

2) Compute some of digits in numbers from 1 to 10d - 1.  
   Let this sum be w. For 328, we compute sum of digits from 1 to 
   99 using above formula.

3) Find Most significant digit (msd) in n. For 328, msd is 3.

4.a) If MSD is 4. For example if n = 428, then count of
     numbers is sum of following.
     1) Count of numbers from 1 to 399
     2) Count of numbers from 400 to 428 which is 29.

4.b) IF MSD > 4. For example if n is 728, then count of
     numbers is sum of following.
     1) Count of numbers from 1 to 399 and count of numbers
        from 500 to 699, i.e., "a[2] * 6"
     2) Count of numbers from 400 to 499, i.e. 100
     3) Count of numbers from 700 to 728, recur for 28
4.c) IF MSD < 4. For example if n is 328, then count of
     numbers is sum of following.
     1) Count of numbers from 1 to 299 a
     2) Count of numbers from 300 to 328, recur for 28 

Below is C++ implementation of above algorithm.

// C++ program to count numbers having 4 as a digit
#include<bits/stdc++.h>
using namespace std;

// Function to count numbers from 1 to n that have
// 4 as a digit
int countNumbersWith4(int n)
{
    // Base case
   if (n < 4)
      return 0;

   // d = number of digits minus one in n. For 328, d is 2
   int d = log10(n);

   // computing count of numbers from 1 to 10^d-1,
   // d=0 a[0] = 0;
   // d=1 a[1] = count of numbers from 0 to 9 = 1
   // d=2 a[2] = count of numbers from 0 to 99 = a[1]*9 + 10 = 19
   // d=3 a[3] = count of numbers from 0 to 999 = a[2]*19 + 100 = 171
   int *a = new int[d+1];
   a[0] = 0, a[1] = 1;
   for (int i=2; i<=d; i++)
      a[i] = a[i-1]*9 + ceil(pow(10,i-1));

   // Computing 10^d
   int p = ceil(pow(10, d));

    // Most significant digit (msd) of n,
    // For 328, msd is 3 which can be obtained using 328/100
   int msd = n/p;

   // If MSD is 4. For example if n = 428, then count of
   // numbers is sum of following.
   // 1) Count of numbers from 1 to 399
   // 2) Count of numbers from 400 to 428 which is 29.
   if (msd == 4)
      return (msd)*a[d] + (n%p) + 1;

   // IF MSD > 4. For example if n is 728, then count of
   // numbers is sum of following.
   // 1) Count of numbers from 1 to 399 and count of numbers
   //    from 500 to 699, i.e., "a[2] * 6"
   // 2) Count of numbers from 400 to 499, i.e. 100
   // 3) Count of numbers from 700 to 728, recur for 28
   if (msd > 4)
      return (msd-1)*a[d] + p + countNumbersWith4(n%p);

   // IF MSD < 4. For example if n is 328, then count of
   // numbers is sum of following.
   // 1) Count of numbers from 1 to 299 a
   // 2) Count of numbers from 300 to 328, recur for 28
   return (msd)*a[d] + countNumbersWith4(n%p);
}

// Driver Program
int main()
{
   int n = 328;
   cout << "Count of numbers from 1 to " << n 
        << " that have 4 as a a digit is " 
        << countNumbersWith4(n) << endl;
   return 0;
}

Output:

Count of numbers from 1 to 328 that have 4 as a a digit is 60

Asked in: Morgan-Stanley

This article is contributed by Shivam. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above




Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.

Recommended Posts:



3.6 Average Difficulty : 3.6/5.0
Based on 29 vote(s)