#include <iostream>
using namespace std;
int countm(int max,const int &n)
{
//在1到max之间的数中,计算数字n出现的次数,并返回
int total=0; //记录n出现的位数
int num=0; //每个权值内出现的n的个数,如10(1-9)内,1-9各出现一次
int a=1; //操作的位,a等于1时,操作的位为个位,依次类推
int c=0; //每位上出现的数字
int b=0; //当前操作位后的数(如115,现在操作的位为百位1,则b等于15)
while(max>0){
num=num*10+a/10; //权值a内出现的n的个数,如a=100时,num=20;表示每一百个数内出现20个n
b=a*c/10+b; //计算得到b
c=max%10; //得到当前需要处理的位上的数字(0-9)
max=max/10; //得到下一下需要操作的位
if(c>n&&n) total+=a+c*num; //当前位大于n,且n不等于0时,对n出现的次数累加
else if(!n&&c>n) total+=c*num; //当前位大于n,且n等于0时,对n出现的次数累加
else if(c==n) total+=c*num+b+1; //c=n时,对n出现的次数累加
else total+=c*num; //c<n时,对n出现的次数累加
a=a*10; //权值增加,如由10变为100
}
return total; //返回n出现的位数
}
int main()
{
int num; //当前需要操作的数
for(int i=0;i<total;i++)
{
cin>>num; //读取当前需要操作的数
for (int j=0;j<=9;j++)
cout<<countm(num,j)<<" "; //调用countm×),对1-num内出现的j的个数进行计算,并输出到out.txt文件
cout<<endl;
}
system("pause");
return 0;
}