参考资料:http://blog.csdn.net/jcwKyl/article/details/3009244
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
/*f(n)=10f(n-1)+10^(n-1) 推导出 f(n)=n*10^(n-1)*/
int main()
{
int i,len,n,tempn,templen;
int pow[10];
int temp=1;
int highNum;
int count[10];
memset(count,0,sizeof(count));
for(i=0;i<10;i++)//用于计算pow
{
pow[i]=temp;
temp=temp*10;
}
scanf("%d",&n);
i=1;
len=1;
while(n>=pow[i])
{
len++;
i++;
}
tempn=n;
templen=len;
while(templen>1)
{
highNum=tempn/pow[templen-1];
for(i=0;i<10;i++)
{
count[i]+=highNum*(templen-1)*pow[templen-2];//算出除了最高位时已经出现的次数,如n=34567时,那么在00000--29999时出现了3个 4*10^(3)
}
for(i=0;i<highNum;i++)//算最高位 0 1 2出现的次数
{
count[i]+=pow[templen-1];
}
tempn=tempn%pow[templen-1];//算出除了最高位剩下的数
count[highNum] += tempn+1;//最高位3出现的次数
templen--;
}
for(i=0;i<=tempn;i++)
{
count[i]++;
}
//去前导的0
for(i=0;i<len;i++)
{
count[0] -= pow[i];
}
for(i=0;i<10;i++)
{
printf("%d\n",count[i]);
}
return 0;
}