问题描述:
一本书的页码从自然数1开始顺序编码到自然数n。
书的页码按照通常的习惯编排,每个页码都不包含多余的前导数字0,
Eg:页码6 不使用 006 。数学计数问题要求给定书的总页码n,计算出书的全部页码分别用到了多少次数字0,1,2,3,… ,9.
#include <iostream>
#include <cmath>
#include <stdio.h>
using namespace std;
int main()
{
int count[10];
int i,j,k,L;
int n,len,m;
while(scanf("%d",&n)!=EOF)
{
m=n;
L=ceil(log10(n+1));
for(i=0;i<10;i++)
count[i] = 0;
for(j=0;j<L;j++)
{
len=ceil(log10(m+1)); //从高位到低位取个位数的值
k=m/pow(10.0,len-1); //从K*len的数值 0-9出现的次数
for(i=0;i<10;i++)
count[i] += k*(len-1)*pow(10.0,len-2); //在高位小于数值K的数字出现的次数
for(i=0;i<k;i++)
count[i] += pow(10.0,len-1); //在高位数值K出现的次数
count[k]+=m-k*pow(10.0,len-1)+1;//去掉以计算的高位
m=m-k*pow(10.0,len-1);
} //去掉前导0
for(i=0;i<L;i++)
count[0] -= pow(10.0,i);
for(i=0;i<10;i++)
printf("%d\n",count[i]);
}
return 0;
}