#include<stdio.h> #include<math.h> void GetParamater(int a[7][10],int n,int m,int sum0[7]); void GetSum(int data,int sum[10],int a[7][10]); int main(){ int a[7][10] ; int data,sum[10],sum0[7]; GetParamater(a,6,10,sum0); //printf("%lf\n",log10(92345)); while(scanf("%d",&data)){ GetSum(data,sum,a); sum[0]-=sum0[(int)log10(data)+1]; for(int x=0;x<10;x++){ printf("%d\n",sum[x]); } } return 0; } void GetParamater(int a[7][10],int n,int m,int sum0[7]){ for(int k=0;k<m;k++) a[0][k] = 0; sum0[0]=0; for(int i=1,temp=1;i<=n;i++){ for(int j=0;j<m;j++){ a[i][j] = 10*a[i-1][j]+ temp; //printf("%d ",a[i][j]); } sum0[i]=sum0[i-1]+temp; temp *= 10; //putchar('\n'); } } void GetSum(int data,int sum[10],int a[7][10]){ for(int i=0;i<10;i++){ sum[i]=0; } while(data!=0){ int k = (int)log10(data); //表示最高位是多少! int p = pow(10,k); int high = data/p; //printf("k=%d p=%d high=%d\n",k,p,high); for(int x=0;x<high;x++){ sum[x]+=p; for(int y=0;y<10;y++){ sum[y]+=a[k][y]; } } //printf("data/p = %d p=%d\n",data%p+1,p); sum[high]+=(data%p+1); //printf("sum[high]%d %d\n",sum[high],high); //printf("%d\n",data); data%=p; p/=10; } //printf("data=%d\n",data); }
数字统计问题
一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2,…,9。
编程任务:给定表示书的总页码的10 进制整数n (1≤n≤10^9) 。编程计算书的全部页码中分别用到多少次数字0,1,2,…,9。
输入: 每个输入只有1 行,给出表示书的总页码的整数n。
输出: 程序运行结束时,输出有10行,在第k行输出页码中用到数字k-1 的次数,k=1,2,…,10。