统计数字

Description一本书的页码是从自然数1开始顺序编码直到自然数n.书的页码按照通常习惯编排,每个页码都不含多余的前导数字0。例如,第6页用数字6表示,而不是06或006等。数字记数问题要求给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1…..9。
Input输入只有一个数字书的全部页码n(这里1<=n<1000000000)
Output从0到9依次输出这几个数字在页码中出现的次数,每个数字一行。

Sample Input

999

Sample Output

0 189
1 300
2 300
3 300
4 300
5 300
6 300
7 300
8 300
9 300
Hint
呵呵,n的值给的够大,一部天书啊!



#include<stdio.h>
long a[10]={0};
void deal(long n)
{
a[n%10]++;
n=n/10;
while(n)
{
a[n%10]++;
n=n/10;
}
}
long pow1(int n)
{
long k=1;
while(n)
{
k=k*10;
n--;
}
return k;
}
int sort(int n)
{
int t=0;
long m=1;
while(n/m)
{
t++;
m=m*10;
}
return t;
}
void main()
{
long n,i,j,k=11;
long b[9][10];
scanf("%d",&n);
b[0][0]=0,b[1][0]=9;
for(i=2;i<9;i++)
{
b[i][0]=i*pow1(i)-k;
k=k*10+1;
}
for(i=0;i<9;i++)
b[i][1]=(i+1)*pow1(i);
for(i=0;i<9;i++)
for(j=2;j<10;j++)
b[i][j]=b[i][1];
k=0;
if((n+1)%10==0)
{
for(i=0;i<10;i++)
printf("%d %d\n",i,b[sort(n)-1][i]);
}
else if(n<9)
{
printf("0 0\n");
for(i=1;i<10;i++)
if(i<n)printf("%d 1\n",i);
else printf("%d 0\n",i);
}
else
{
long x,y,zx,wy;
k=sort(n);
x=pow1(k-1)-1;
y=pow1(k)-1;
zx=n-x;
wy=y-n;
if(zx>wy)
{
for(i=n+1;i<=y;i++)
deal(i);
for(i=0;i<10;i++)
printf("%d %d\n",i,b[k-1][i]-a[i]);
}
else
{
for(i=x+1;i<=n;i++)
deal(i);
for(i=0;i<10;i++)
printf("%d %d\n",i,b[k-2][i]+a[i]);
}
}
}

posted @ 2013-06-23 22:07  失眠的娃儿  阅读(263)  评论(0编辑  收藏  举报