# 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

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the **Essential Maths for CP Course** at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more, please refer **Complete Interview Preparation Course****.**

## 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++

`#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` |

## C

`#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;` `}` |

## Java

`// 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` |

## Python

`# 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` |

## C#

`// 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.` |

## PHP

`<?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.` `?>` |

## Javascript

`<script>` `// javascript program to count numbers that not contain 3` ` ` `// Function that returns count of numbers which` ` ` `// are in range from 1 to n` ` ` `// and not contain 3 as a digit` ` ` `function` `count(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` ` ` `var` `po = 1;` ` ` `while` `(parseInt(n / po) > 9)` ` ` `po = po * 10;` ` ` `// find the most significant digit (msd is 5 for 578)` ` ` `var` `msd = parseInt (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` ` ` `var` `n = 578;` ` ` `document.write(count(n));` `// This code is contributed by gauravrajput1` `</script>` |

**Output:**

385

**Time Complexity: **O(log_{10}n)

**Auxiliary Space: **O(1)

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