题目
The task is simple: given any positive integer N, you are supposed to count the total number of 1's in the decimal form of the integers from 1 to N. For example, given N being 12, there are five 1's in 1, 10, 11, and 12.
Input Specification:
Each input file contains one test case which gives the positive N (<=230).
Output Specification:
For each test case, print the number of 1's in one line.
Sample Input:
12
Sample Output:
5
统计 1~n的所有数中1的数量。
到0时,1的个数为0;到9时,1的个数为1;到99时,1的个数为20……
即 data[i]到i个9时的1的个数data[i]=data[i-1]*10+10^(i-1)
到数字n时的1的总个数递推关系为:
1、先加上最高位i导致的后面出现的(99…99,i-1个9)的次数的引入的1
2、再考虑由最高位引入的1
3、然后删除最高位,循环
代码:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n,num=0; //输入的数,1的个数
cin>>n;
int data[12]; //到第i位(9,99,999…对应1,2,3…)时1的数量(其实就是1,20,300…)
int number[12]; //第i位的数字(从1开始计数)
int i,j,temp=n;
data[0]=0; //0编号用来保证数据安全
number[0]=0;
for(i=1;i<12;i++) //获取data[],number[]
{
number[i]=temp%10;
temp/=10;
if(temp==0) //直到最高位
break;
data[i]=data[i-1]*10+pow(double(10),i-1);
}
for(;i>0;i--)
{
num+=number[i]*data[i-1]; //加上最高位(i)*0到99…99(i个9)时1的个数
if(number[i]>1) //最高位大于1,再加10^(i-1)
num+=(int)pow((double)10,i-1);
else if(number[i]==1) //最高位为1,再加n(已经减去前面的高位)-10^(i-1)+1
num+=n-(int)pow((double)10,i-1)+1;
n-=number[i]*(int)pow((double)10,i-1); //去掉最高位
}
cout<<num;
return 0;
}