给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。
例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。
Input
输入N(1 <= N <= 10^9)
Output
输出包含1的个数
Input示例
12
Output示例
5
#include<bits/stdc++.h>
using namespace std;
int dp[];
void init()
{
dp[] = ;
for(int i=;i<=;i++)
dp[i] = *dp[i-] + pow(,i-);////预处理每位数中1的个数,例如i=3,就是1~999中含有1的个数
} int Count(int n)
{
int res=,len=,tail=,radix=,digit=;
while (n)
{
digit = n%;
n/=;
len++; if( digit > )
res += radix+digit * dp[len-]; //radix表示10^(len-1),例如len=3,就会有100~199这些数要计算,前导的1会产生radix个
else if(digit == )
{
res += tail + + dp[len-];//tali表示dight后面的数
}
tail += digit *radix;
radix *= ;
}
return res;
} int main ()
{
init();
int n;
scanf("%d",&n);
printf("%d\n",Count(n));
}