Count numbers having 0 as a digit
Last Updated :
28 Dec, 2023
Problem: Count how many integers from 1 to N contains 0 as a digit.
Examples:
Input: n = 9
Output: 0
Input: n = 107
Output: 17
The numbers having 0 are 10, 20,..90, 100, 101..107
Input: n = 155
Output: 24
The numbers having 0 are 10, 20,..90, 100, 101..110,
120, ..150.
A naive solution is discussed in previous post
In this post an optimized solution is discussed. Let’s analyze the problem closely.
Let the given number has d digits .
The required answer can be computed by computing the following two values:
- Count of 0 digit integers having maximum of d-1 digits.
- Count of 0 digit integers having exactly d digits (less than/ equal to the given number of course!)
Therefore, the solution would be the sum of above two.
The first part has already been discussed here.
How to find the second part?
We can find the total number of integers having d digits (less than equal to given number), which don’t contain any zero.
To find this we traverse the number, one digit at a time.
We find count of non-negative integers as follows:
- If the number at that place is zero, decrement counter by 1 and break (because we can’t move any further, decrement to assure that the number itself contains a zero)
- else , multiply the (number-1), with power(9, number of digits to the right to it)
Let’s illustrate with an example.
Let the number be n = 123. non_zero = 0
We encounter 1 first,
add (1-1)*92 to non_zero (= 0+0)
We encounter 2,
add (2-1)*91 to non_zero (= 0+9 = 9)
We encounter 3,
add (3-1)*90 to non_zero (=9+3 = 12)
We can observe that non_zero denotes the number of integer consisting of 3 digits (not greater than 123) and don’t contain any zero. i.e., (111, 112, ….., 119, 121, 122, 123) (It is recommended to verify it once)
Now, one may ask what’s the point of calculating the count of numbers which don’t have any zeroes?
Correct! we’re interested to find the count of integers which have zero.
However, we can now easily find that by subtracting non_zero from n after ignoring the most significant place.i.e., In our previous example zero = 23 – non_zero = 23-12 =11 and finally we add the two parts to arrive at the required result!!
Below is implementation of above idea.
C++
#include <bits/stdc++.h>
using namespace std;
int zeroUpto( int digits)
{
int first = ( pow (10,digits)-1)/9;
int second = ( pow (9,digits)-1)/8;
return 9 * (first - second);
}
int toInt( char c)
{
return int (c)-48;
}
int countZero(string num)
{
int k = num.length();
int total = zeroUpto(k-1);
int non_zero = 0;
for ( int i=0; i<num.length(); i++)
{
if (num[i] == '0' )
{
non_zero--;
break ;
}
non_zero += (toInt(num[i])-1) * ( pow (9,k-1-i));
}
int no = 0, remaining = 0,calculatedUpto=0;
for ( int i=0; i<num.length(); i++)
{
no = no*10 + (toInt(num[i]));
if (i != 0)
calculatedUpto = calculatedUpto*10 + 9;
}
remaining = no-calculatedUpto;
int ans = zeroUpto(k-1) + (remaining-non_zero-1);
return ans;
}
int main()
{
string num = "107" ;
cout << "Count of numbers from 1" << " to "
<< num << " is " << countZero(num) << endl;
num = "1264" ;
cout << "Count of numbers from 1" << " to "
<< num << " is " <<countZero(num) << endl;
return 0;
}
|
Java
public class GFG {
static int zeroUpto( int digits)
{
int first = ( int ) ((Math.pow( 10 ,digits)- 1 )/ 9 );
int second = ( int ) ((Math.pow( 9 ,digits)- 1 )/ 8 );
return 9 * (first - second);
}
static int toInt( char c)
{
return ( int )(c)- 48 ;
}
static int countZero(String num)
{
int k = num.length();
int total = zeroUpto(k- 1 );
int non_zero = 0 ;
for ( int i= 0 ; i<num.length(); i++)
{
if (num.charAt(i) == '0' )
{
non_zero--;
break ;
}
non_zero += (toInt(num.charAt(i))- 1 ) * (Math.pow( 9 ,k- 1 -i));
}
int no = 0 , remaining = 0 ,calculatedUpto= 0 ;
for ( int i= 0 ; i<num.length(); i++)
{
no = no* 10 + (toInt(num.charAt(i)));
if (i != 0 )
calculatedUpto = calculatedUpto* 10 + 9 ;
}
remaining = no-calculatedUpto;
int ans = zeroUpto(k- 1 ) + (remaining-non_zero- 1 );
return ans;
}
static public void main(String[] args) {
String num = "107" ;
System.out.println( "Count of numbers from 1" + " to "
+ num + " is " + countZero(num));
num = "1264" ;
System.out.println( "Count of numbers from 1" + " to "
+ num + " is " +countZero(num));
}
}
|
Python3
def zeroUpto(digits):
first = int (( pow ( 10 , digits) - 1 ) / 9 );
second = int (( pow ( 9 , digits) - 1 ) / 8 );
return 9 * (first - second);
def countZero(num):
k = len (num);
total = zeroUpto(k - 1 );
non_zero = 0 ;
for i in range ( len (num)):
if (num[i] = = '0' ):
non_zero - = 1 ;
break ;
non_zero + = ((( ord (num[i]) - ord ( '0' )) - 1 ) *
( pow ( 9 , k - 1 - i)));
no = 0 ;
remaining = 0 ;
calculatedUpto = 0 ;
for i in range ( len (num)):
no = no * 10 + ( ord (num[i]) - ord ( '0' ));
if (i ! = 0 ):
calculatedUpto = calculatedUpto * 10 + 9 ;
remaining = no - calculatedUpto;
ans = zeroUpto(k - 1 ) + (remaining - non_zero - 1 );
return ans;
num = "107" ;
print ( "Count of numbers from 1 to" ,
num, "is" , countZero(num));
num = "1264" ;
print ( "Count of numbers from 1 to" ,
num, "is" , countZero(num));
|
C#
using System;
public class GFG{
static int zeroUpto( int digits)
{
int first = ( int ) ((Math.Pow(10,digits)-1)/9);
int second = ( int ) ((Math.Pow(9,digits)-1)/8);
return 9 * (first - second);
}
static int toInt( char c)
{
return ( int )(c)-48;
}
static int countZero(String num)
{
int k = num.Length;
int total = zeroUpto(k-1);
int non_zero = 0;
for ( int i=0; i<num.Length; i++)
{
if (num[i] == '0' )
{
non_zero--;
break ;
}
non_zero += (toInt(num[i])-1) * ( int )(Math.Pow(9,k-1-i));
}
int no = 0, remaining = 0,calculatedUpto=0;
for ( int i=0; i<num.Length; i++)
{
no = no*10 + (toInt(num[i]));
if (i != 0)
calculatedUpto = calculatedUpto*10 + 9;
}
remaining = no-calculatedUpto;
int ans = zeroUpto(k-1) + (remaining-non_zero-1);
return ans;
}
static public void Main() {
String num = "107" ;
Console.WriteLine( "Count of numbers from 1" + " to "
+ num + " is " + countZero(num));
num = "1264" ;
Console.WriteLine( "Count of numbers from 1" + " to "
+ num + " is " +countZero(num));
}
}
|
Javascript
<script>
function zeroUpto(digits)
{
var first = parseInt( ((Math.pow(10,digits)-1)/9));
var second = parseInt( ((Math.pow(9,digits)-1)/8));
return 9 * (first - second);
}
function toInt(c)
{
return parseInt((c.charCodeAt(0))-48);
}
function countZero(num)
{
var k = num.length;
var total = zeroUpto(k-1);
var non_zero = 0;
for (i=0; i<num.length; i++)
{
if (num.charAt(i) == '0')
{
non_zero--;
break ;
}
non_zero += (toInt(num.charAt(i))-1) * (Math.pow(9,k-1-i));
}
var no = 0, remaining = 0,calculatedUpto=0;
for (i=0; i<num.length; i++)
{
no = no*10 + (toInt(num.charAt(i)));
if (i != 0)
calculatedUpto = calculatedUpto*10 + 9;
}
remaining = no-calculatedUpto;
var ans = zeroUpto(k-1) + (remaining-non_zero-1);
return ans;
}
var num = "107" ;
document.write( "Count of numbers from 1" + " to "
+ num + " is " + countZero(num));
var num = "1264" ;
document.write( "<br>Count of numbers from 1" + " to "
+ num + " is " +countZero(num));
</script>
|
PHP
<?php
function zeroUpto( $digits )
{
$first = (int)((pow(10,
$digits ) - 1) / 9);
$second = (int)((pow(9,
$digits ) - 1) / 8);
return 9 * ( $first - $second );
}
function countZero( $num )
{
$k = strlen ( $num );
$total = zeroUpto( $k -1);
$non_zero = 0;
for ( $i = 0;
$i < strlen ( $num ); $i ++)
{
if ( $num [ $i ] == '0' )
{
$non_zero --;
break ;
}
$non_zero += (( $num [ $i ] - '0' ) - 1) *
(pow(9, $k - 1 - $i ));
}
$no = 0;
$remaining = 0;
$calculatedUpto = 0;
for ( $i = 0;
$i < strlen ( $num ); $i ++)
{
$no = $no * 10 + ( $num [ $i ] - '0' );
if ( $i != 0)
$calculatedUpto = $calculatedUpto *
10 + 9;
}
$remaining = $no - $calculatedUpto ;
$ans = zeroUpto( $k - 1) +
( $remaining -
$non_zero - 1);
return $ans ;
}
$num = "107" ;
echo "Count of numbers from 1 to " .
$num . " is " .
countZero( $num ) . "\n" ;
$num = "1264" ;
echo "Count of numbers from 1 to " .
$num . " is " .
countZero( $num );
?>
|
Output:
Count of numbers from 1 to 107 is 17
Count of numbers from 1 to 1264 is 315
Complexity Analysis:
Time Complexity : O(d), where d is no. of digits i.e., O(log(n)
Auxiliary Space : O(1)
Approach#2: Using for loop
This code defines a function count_zeros_brute_force that takes an integer n as input and counts the number of integers from 1 to n that have the digit 0. The function simply iterates over all integers from 1 to n and checks if the string representation of each integer contains the character ‘0’. If it does, the count is incremented.The code then calls the function count_zeros_brute_force twice with different values of n and prints the results.
Algorithm
1. Initialize a counter variable to 0.
2. Traverse from 1 to n and for each number check if it has 0 in it.
3. If the number has 0, increment the counter variable.
4. Return the counter variable as the output.
C++
#include <string> // for string data type
#include <iostream>
int count_zeros_brute_force( int n) {
int count = 0;
for ( int i = 1; i <= n; i++) {
if (std::to_string(i).find( '0' ) != std::string::npos) {
count++;
}
}
return count;
}
int main() {
int n = 107;
std::cout << count_zeros_brute_force(n) << std::endl;
n = 1264;
std::cout << count_zeros_brute_force(n) << std::endl;
return 0;
}
|
Java
public class CountZeros {
static int countZerosBruteForce( int n) {
int count = 0 ;
for ( int i = 1 ; i <= n; i++) {
if (String.valueOf(i).contains( "0" )) {
count++;
}
}
return count;
}
public static void main(String[] args) {
int n = 107 ;
System.out.println(countZerosBruteForce(n));
n = 1264 ;
System.out.println(countZerosBruteForce(n));
}
}
|
Python3
def count_zeros_brute_force(n):
count = 0
for i in range ( 1 , n + 1 ):
if '0' in str (i):
count + = 1
return count
n = 107
print (count_zeros_brute_force(n))
n = 1264
print (count_zeros_brute_force(n))
|
C#
using System;
class Program
{
static int CountZerosBruteForce( int n)
{
int count = 0;
for ( int i = 1; i <= n; i++)
{
if (i.ToString().Contains( '0' ))
{
count++;
}
}
return count;
}
static void Main()
{
int n = 107;
Console.WriteLine(CountZerosBruteForce(n));
n = 1264;
Console.WriteLine(CountZerosBruteForce(n));
}
}
|
Javascript
function countZerosBruteForce(n) {
let count = 0;
for (let i = 1; i <= n; i++) {
if (i.toString().includes( '0' )) {
count++;
}
}
return count;
}
let n = 107;
console.log(countZerosBruteForce(n));
n = 1264;
console.log(countZerosBruteForce(n));
|
Time Complexity: O(nlogn) for converting integer to string.
Space Complexity: O(1)
Share your thoughts in the comments
Please Login to comment...