# 算法题：2的出现次数（从0到n的数字）

2021年4月15日18:51:08 发表评论 720 次浏览

## 本文概述

``````Input : 22
Output : 6
Explanation: Total 2s that appear as digit
from 0 to 22 are (2, 12, 20, 21, 22);

Input : 100
Output : 20
Explanation: total 2's comes between 0 to 100
are (2, 12, 20, 21, 22..29, 32, 42, 52, 62, 72, 82, 92);``````

## C++

``````//C++ program to count 2s from 0 to n
#include <bits/stdc++.h>
using namespace std;

//Counts the number of '2'
//digits in a single number
int number0f2s( int n)
{
int count = 0;
while (n> 0)
{
if (n % 10 == 2)
count++;

n = n /10;
}
return count;
}

//Counts the number of '2'
//digits between 0 and n
int numberOf2sinRange( int n)
{
//Initialize result
int count = 0 ;

//Count 2's in every number
//from 2 to n
for ( int i = 2; i <= n; i++)
count += number0f2s(i);

return count;
}

//Driver Code
int main()
{
cout <<numberOf2sinRange(22);
cout <<endl;
cout <<numberOf2sinRange(100);
return 0;
}``````

## Java

``````//Java program to count 2s from 0 to n

class GFG
{

//Counts the number of '2'
//digits in a single number
static int number0f2s( int n)
{
int count = 0 ;
while (n> 0 )
{
if (n % 10 == 2 )
count++;

n = n /10 ;
}
return count;
}

//Counts the number of '2'
//digits between 0 and n
static int numberOf2sinRange( int n)
{

//Initialize result
int count = 0 ;

//Count 2's in every number
//from 2 to n
for ( int i = 2 ; i <= n; i++)
count += number0f2s(i);

return count;
}

//Driver code
public static void main(String[] args)
{
System.out.print(numberOf2sinRange( 22 ));
System.out.println();
System.out.print(numberOf2sinRange( 100 ));
}
}

//This code is contributed by Anant Agarwal.``````

## Python3

``````# Python3 program to count
# 2s from 0 to n

# Counts the number of
# '2' digits in a
# single number
def number0f2s(n):

count = 0
while (n> 0 ):

if (n % 10 = = 2 ):
count = count + 1

n = n //10

return count

# Counts the number of '2'
# digits between 0 and n
def numberOf2sinRange(n):

# Initialize result
count = 0

# Count 2's in every number
# from 2 to n
for i in range ( 2 , n + 1 ):
count = count + number0f2s(i)

return count

# Driver code

print (numberOf2sinRange( 22 ))
print (numberOf2sinRange( 100 ))

# This code is contributed
# by Anant Agarwal.``````

## C#

``````//C# program to count 2s from 0 to n
using System;

class GFG
{

//Counts the number of '2' digits
//in a single number
static int number0f2s( int n)
{
int count = 0;
while (n> 0)
{
if (n % 10 == 2)
count++;

n = n /10;
}
return count;
}

//Counts the number of '2' digits
//between 0 and n
static int numberOf2sinRange( int n)
{

//Initialize result
int count = 0;

//Count 2's in every number
//from 2 to n
for ( int i = 2; i <= n; i++)
count += number0f2s(i);

return count;
}

//Driver code
public static void Main()
{
Console.Write(numberOf2sinRange(22));
Console.WriteLine();
Console.Write(numberOf2sinRange(100));
}
}

//This code is contributed by nitin mittal``````

## PHP

``````<?php
//php program to count 2s from 0 to n

//Counts the number of '2'
//digits in a single number
function number0f2s( \$n )
{
\$count = 0;
while ( \$n> 0)
{
if ( \$n % 10 == 2)
\$count ++;

\$n = \$n /10;
}
return \$count ;
}

//Counts the number of '2'
//digits between 0 and n
function numberOf2sinRange( \$n )
{

//Initialize result
\$count = 0 ;

//Count 2's in every number
//from 2 to n
for ( \$i = 2; \$i <= \$n ; \$i ++)
\$count += number0f2s( \$i );

return \$count ;
}

//Driver Code
echo (numberOf2sinRange(22));
echo "\n" ;
echo numberOf2sinRange(100);

//This code is contributed by
//nitin mittal.
?>``````

``````6
20``````

## Python3

``````# Write Python3 code here
def numberOf2sinRange(n):
s = ""
for i in range ( 0 , n + 1 ):
s + = str (i)
return ( list (s).count( '2' ))

# Driver code
n = 30
print (numberOf2sinRange(n))``````

``13``

``````0  1  2  3  4  5  6  7  8  9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
......
110 111 112 113 114 115 116 117 118 119``````

``````if x[d) <2: count2sinRangeAtDigit(x, d) =
Compute y = round down to nearest 10d+1
return y/10``````

``````if x[d)> 2: count2sinRangeAtDigit(x, d) =
Compute y = round down to nearest 10d+1
return y /10``````

``````if x[d] = 2: count2sinRangeAtDigit(x, d) =
Compute y = round down to nearest 10d+1
Compute z = right side of x (i.e., x%  10d)
return y/10 + z + 1``````

## C++

``````//C++ program to count 2s from 0 to n
#include <bits/stdc++.h>
using namespace std;

//Counts the number of 2s
//in a number at d-th digit
int count2sinRangeAtDigit( int number, int d)
{
int powerOf10 = ( int ) pow (10, d);
int nextPowerOf10 = powerOf10 * 10;
int right = number % powerOf10;

int roundDown = number - number % nextPowerOf10;
int roundup = roundDown + nextPowerOf10;

int digit = (number /powerOf10) % 10;

//if the digit in spot digit is
if (digit <2)
return roundDown /10;

if (digit == 2)
return roundDown /10 + right + 1;

return roundup /10;
}

//Counts the number of '2' digits between 0 and n
int numberOf2sinRange( int number)
{
//Convert integer to String
//to find its length
stringstream convert;
convert <<number;
string s = convert.str();
int len = s.length();

//Traverse every digit and
//count for every digit
int count = 0;
for ( int digit = 0; digit <len; digit++)
count += count2sinRangeAtDigit(number, digit);

return count;
}

//Driver Code
int main()
{
cout <<numberOf2sinRange(22) <<endl;
cout <<numberOf2sinRange(100);
return 0;
}``````

## Java

``````//Java program to count 2s from 0 to n
class GFG
{

//Counts the number of 2s
//in a number at d-th digit
static int count2sinRangeAtDigit( int number, int d)
{
int powerOf10 = ( int ) Math.pow( 10 , d);
int nextPowerOf10 = powerOf10 * 10 ;
int right = number % powerOf10;

int roundDown = number - number % nextPowerOf10;
int roundup = roundDown + nextPowerOf10;

int digit = (number /powerOf10) % 10 ;

//if the digit in spot digit is
if (digit <2 )
{
return roundDown /10 ;
}

if (digit == 2 )
{
return roundDown /10 + right + 1 ;
}
return roundup /10 ;
}

//Counts the number of '2' digits between 0 and n
static int numberOf2sinRange( int number)
{
//Convert integer to String
//to find its length
String convert;
convert = String.valueOf(number);
String s = convert;
int len = s.length();

//Traverse every digit and
//count for every digit
int count = 0 ;
for ( int digit = 0 ; digit <len; digit++)
{
count += count2sinRangeAtDigit(number, digit);
}

return count;
}

//Driver Code
public static void main(String[] args)
{
System.out.println(numberOf2sinRange( 22 ));
System.out.println(numberOf2sinRange( 100 ));
}
}

//This code is contributed by PrinciRaj1992``````

## Python3

``````# Python3 program to count 2s from 0 to n

# Counts the number of 2s in a
# number at d-th digit
def count2sinRangeAtDigit(number, d):

powerOf10 = int ( pow ( 10 , d));
nextPowerOf10 = powerOf10 * 10 ;
right = number % powerOf10;

roundDown = number - number % nextPowerOf10;
roundup = roundDown + nextPowerOf10;

digit = (number //powerOf10) % 10 ;

# if the digit in spot digit is
if (digit <2 ):
return roundDown //10 ;

if (digit = = 2 ):
return roundDown //10 + right + 1 ;

return roundup //10 ;

# Counts the number of '2' digits
# between 0 and n
def numberOf2sinRange(number):

# Convert integer to String
# to find its length
s = str (number);
len1 = len (s);

# Traverse every digit and
# count for every digit
count = 0 ;
for digit in range (len1):
count + = count2sinRangeAtDigit(number, digit);

return count;

# Driver Code
print (numberOf2sinRange( 22 ));
print (numberOf2sinRange( 100 ));

# This code is contributed by mits``````

## C#

``````//C# program to count 2s from 0 to n
using System;

class GFG
{

//Counts the number of 2s
//in a number at d-th digit
static int count2sinRangeAtDigit( int number, int d)
{
int powerOf10 = ( int ) Math.Pow(10, d);
int nextPowerOf10 = powerOf10 * 10;
int right = number % powerOf10;

int roundDown = number - number % nextPowerOf10;
int roundup = roundDown + nextPowerOf10;

int digit = (number /powerOf10) % 10;

//if the digit in spot digit is
if (digit <2)
{
return roundDown /10;
}

if (digit == 2)
{
return roundDown /10 + right + 1;
}
return roundup /10;
}

//Counts the number of '2' digits
//between 0 and n
static int numberOf2sinRange( int number)
{
//Convert integer to String
//to find its length
string convert;
convert = number.ToString();
string s = convert;
int len = s.Length;

//Traverse every digit and
//count for every digit
int count = 0;
for ( int digit = 0; digit <len; digit++)
{
count += count2sinRangeAtDigit(number, digit);
}

return count;
}

//Driver Code
public static void Main()
{
Console.WriteLine(numberOf2sinRange(22));
Console.WriteLine(numberOf2sinRange(100));
}
}

//This code is contributed by mits``````

## PHP

``````<?php
//PHP program to count 2s from 0 to n

//Counts the number of 2s in a number
//at d-th digit
function count2sinRangeAtDigit( \$number , \$d )
{
\$powerOf10 = (int)pow(10, \$d );
\$nextPowerOf10 = \$powerOf10 * 10;
\$right = \$number % \$powerOf10 ;

\$roundDown = \$number - \$number %
\$nextPowerOf10 ;
\$roundup = \$roundDown + \$nextPowerOf10 ;

\$digit = ( \$number /\$powerOf10 ) % 10;

//if the digit in spot digit is
if ( \$digit <2)
return \$roundDown /10;

if ( \$digit == 2)
return \$roundDown /10 + \$right + 1;

return \$roundup /10;
}

//Counts the number of '2' digits
//between 0 and n
function numberOf2sinRange( \$number )
{
//Convert integer to String
//to find its length
\$s = strval ( \$number );
\$len = strlen ( \$s );

//Traverse every digit and
//count for every digit
\$count = 0;
for ( \$digit = 0; \$digit <\$len ; \$digit ++)
\$count += count2sinRangeAtDigit( \$number , \$digit );

return \$count ;
}

//Driver Code
print (numberOf2sinRange(22) . "\n" );
print (numberOf2sinRange(100) . "\n" );

//This code is contributed by mits
?>``````

``````6
20``````