Count numbers that don’t contain 3

Given a number n, write a function that returns count of numbers from 1 to n that don’t contain digit 3 in their decimal representation.

Examples:

Input: n = 10
Output: 9 

Input: n = 45
Output: 31 
// Numbers 3, 13, 23, 30, 31, 32, 33, 34, 
// 35, 36, 37, 38, 39, 43 contain digit 3. 

Input: n = 578
Output: 385

We strongly recommend that you click here and practice it, before moving on to the solution.


Solution:
We can solve it recursively. Let count(n) be the function that counts such numbers.

'msd' --> the most significant digit in n 
'd'   --> number of digits in n.

count(n) = n if n < 3

count(n) = n - 1 if 3 <= n  10 and msd is not 3

count(n) = count( msd * (10^(d-1)) - 1) 
           if n > 10 and msd is 3
Let us understand the solution with n = 578. 
count(578) = 4*count(99) + 4 + count(78)
The middle term 4 is added to include numbers 
100, 200, 400 and 500.

Let us take n = 35 as another example.  
count(35) = count (3*10 - 1) = count(29)

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

#include <bits/stdc++.h>
using namespace std;
  
/* returns count of numbers which are 
in range from 1 to n and don't contain 3 
as a digit */
int count(int n) 
    // Base cases (Assuming n is not negative) 
    if (n < 3) 
        return n; 
    if (n >= 3 && n < 10) 
        return n-1; 
  
    // Calculate 10^(d-1) (10 raise to the power d-1) where d is 
    // number of digits in n. po will be 100 for n = 578 
    int po = 1; 
    while (n/po > 9) 
        po = po*10; 
  
    // find the most significant digit (msd is 5 for 578) 
    int msd = n/po; 
  
    if (msd != 3) 
        // For 578, total will be 4*count(10^2 - 1) + 4 + count(78) 
        return count(msd)*count(po - 1) + count(msd) + count(n%po); 
    else
        // For 35, total will be equal to count(29) 
        return count(msd*po - 1); 
  
// Driver code 
int main() 
    cout << count(578) << " "
    return 0; 
  
// This code is contributed by rathbhupendra

chevron_right


C

filter_none

edit
close

play_arrow

link
brightness_4
code

#include <stdio.h>
  
/* returns count of numbers which are in range from 1 to n and don't contain 3 
   as a digit */
int count(int n)
{
    // Base cases (Assuming n is not negative)
    if (n < 3)
        return n;
    if (n >= 3 && n < 10)
       return n-1;
  
    // Calculate 10^(d-1) (10 raise to the power d-1) where d is
    // number of digits in n. po will be 100 for n = 578
    int po = 1;
    while (n/po > 9)
        po = po*10;
  
    // find the most significant digit (msd is 5 for 578)
    int msd = n/po;
  
    if (msd != 3)
      // For 578, total will be 4*count(10^2 - 1) + 4 + count(78)
      return count(msd)*count(po - 1) + count(msd) + count(n%po);
    else
      // For 35, total will be equal to count(29)
      return count(msd*po - 1);
}
  
// Driver program to test above function
int main()
{
    printf ("%d ", count(578));
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to count numbers that not contain 3
import java.io.*;
  
class GFG 
{
    // Function that returns count of numbers which 
    // are in range from 1 to n 
    // and not contain 3 as a digit
    static int count(int n)
    {
        // Base cases (Assuming n is not negative)
        if (n < 3)
            return n;
        if (n >= 3 && n < 10)
            return n-1;
   
        // Calculate 10^(d-1) (10 raise to the power d-1) where d is
        // number of digits in n. po will be 100 for n = 578
        int po = 1;
        while (n/po > 9)
            po = po*10;
   
        // find the most significant digit (msd is 5 for 578)
        int msd = n/po;
   
        if (msd != 3)
            // For 578, total will be 4*count(10^2 - 1) + 4 + count(78)
            return count(msd)*count(po - 1) + count(msd) + count(n%po);
        else
            // For 35, total will be equal to count(29)
            return count(msd*po - 1);
    }
      
    // Driver program
    public static void main (String[] args) 
    {
        int n = 578;
        System.out.println(count(n));
    }
}
  
// Contributed by Pramod Kumar

chevron_right


Python

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python program to count numbers upto n that don't contain 3
  
# Returns count of numbers which are in range from 1 to n
# and don't contain 3 as a digit
def count(n):
      
    # Base Cases ( n is not negative)
    if n < 3:
        return n
    elif n >= 3 and n < 10:
        return n-1
          
    # Calculate 10^(d-1) ( 10 raise to the power d-1 ) where d
    # is number of digits in n. po will be 100 for n = 578
      
    po = 1
    while n/po > 9:
        po = po * 10
      
    # Find the MSD ( msd is 5 for 578 )
    msd = n/po
      
    if msd != 3:
        # For 578, total will be 4*count(10^2 - 1) + 4 + ccount(78)
        return count(msd) * count(po-1) + count(msd) + count(n%po)
    else:
        # For 35 total will be equal to count(29)
        return count(msd * po - 1)
          
# Driver Program
n = 578
print count(n)
  
# Contributed by Harshit Agrawal

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to count numbers that not
// contain 3
using System;
  
class GFG {
      
    // Function that returns count of 
    // numbers which are in range from 
    // 1 to n and not contain 3 as a
    // digit
    static int count(int n)
    {
          
        // Base cases (Assuming n is 
        // not negative)
        if (n < 3)
            return n;
        if (n >= 3 && n < 10)
            return n-1;
  
        // Calculate 10^(d-1) (10 raise 
        // to the power d-1) where d is
        // number of digits in n. po will
        // be 100 for n = 578
        int po = 1;
          
        while (n / po > 9)
            po = po * 10;
  
        // find the most significant 
        // digit (msd is 5 for 578)
        int msd = n / po;
  
        if (msd != 3)
          
            // For 578, total will be
            // 4*count(10^2 - 1) + 4 +
            // count(78)
            return count(msd) * count(po - 1) 
                + count(msd) + count(n % po);
        else
          
            // For 35, total will be equal 
            // to count(29)
            return count(msd * po - 1);
    }
      
    // Driver program
    public static void Main () 
    {
        int n = 578;
          
        Console.Write(count(n));
    }
}
  
// This code is contributed by Sam007.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
/* returns count of numbers which are in range 
from 1 to n and don't contain 3 as a digit */
function count1($n)
{
      
    // Base cases (Assuming n is not negative)
    if ($n < 3)
        return $n;
    if ($n >= 3 && $n < 10)
        return $n-1;
  
    // Calculate 10^(d-1) (10 raise to the 
    // power d-1) where d is number of digits 
    // in n. po will be 100 for n = 578
    $po = 1;
    for($x = intval($n/$po); $x > 9; $x = intval($n/$po))
        $po = $po*10;
  
    // find the most significant digit (msd is 5 for 578)
    $msd = intval($n / $po);
  
    if ($msd != 3)
      
    // For 578, total will be 4*count(10^2 - 1)
    // + 4 + count(78)
    return count1($msd) * count1($po - 1) +
                count1($msd) + count1($n%$po);
    else
      
    // For 35, total will be equal to count(29)
    return count1($msd*$po - 1);
}
  
// Driver program to test above function
    echo count1(578);
  
// This code is contributed by mits.
?>

chevron_right



Output:

385

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up

Recommended Posts:


Article Tags :
Practice Tags :


3


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