给定一个十进制正整数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
用f(n) 表示1-n所有数字中1的总数,len表示数字n的位数,g(x)表示n数字n的第x位,g(len-1) > 1有f(n) = pow(10,len-1) + g(len-1)*f(pow(10,len-1)-1) + f(n - pow(10,len-1)*g(len-1)),g(len-1) =1 时有 f(n) = f(pow(10,len-1)-1) + f(n - pow(10,len-1)*g(len-1)) + n - pow(10,len-1)*g(len-1)+1。
例:8718,f(8718) = pow(10,3) + 8*f(pow(10,3)-1) + f(718),然后递归...
1718,f(1718) = f(pow(10,3)-1) + f(718) + 718+1
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
int getIthNumber(int value,int iTh)
{//value的iTh位,如8718,iTh=3,返回7
int res = 0;
int index = 0;
while(value){
index ++;
if(iTh == index) {
res = value % 10;
break;
}
value = value/10;
}
return res;
}
int lengthOfNumber(unsigned int value)
{
int len = 0;
while(value){
len++;
value = value/10;
}
return len;
}
int NumberOfDigit1(int value)
{
if (value <1) return 0;
if(value <=9) return 1;
int len = lengthOfNumber(value);
int ithNumber = getIthNumber(value,len);
int x = pow(10,len-1);
int res = 0;
int rest = value - ithNumber * x;
if(ithNumber>1)
res = x + ithNumber * NumberOfDigit1(x-1) + NumberOfDigit1(rest);
else{
res = ithNumber * NumberOfDigit1(x-1) + NumberOfDigit1(rest) + rest + 1 ;
}
return res;
}
int main()
{
int n;
cin>>n;
cout<<NumberOfDigit1(n)<<endl;
return 0;
}