问题描述:一本书的页码从自然数1开始顺序编码到自然数n。书的页码按照通常的习惯编排,每个页码都不包含多余的前导数字0,Eg:页码6 不使用 006 。数学计数问题要求给定书的总页码n,计算出书的全部页码分别用到了多少次数字0,1,2,3,... ,9.
1 #include <stdio.h> 2 int main (void){ 3 int outarr [10]; 4 int a ,b=0; 5 for(int i = 0;i<10 ;i++){ 6 outarr[i] = 0; 7 } 8 scanf("%d",&a); 9 for(int i = 1; i<=a;i++){ 10 b=i; 11 while(b>0){ 12 outarr[b%10]++; 13 b /= 10; 14 } 15 } 16 for(int i =0 ;i<10;i++){ 17 printf("%d\n",outarr[i]); 18 } 19 return 0; 20 }
方法二:
1 #include <iostream> 2 #include <cmath> 3 #include <stdio.h> 4 using namespace std; 5 6 int main(){ 7 int count[10]; 8 int i,j,k,L; 9 int n,len,m; 10 while(scanf("%d",&n)!=EOF){ 11 m=n; 12 L=ceil(log10(n+1)); 13 for(i=0;i<10;i++) count[i] = 0; 14 for(j=0;j<L;j++){ 15 len=ceil(log10(m+1)); 16 //从高位到低位取个位数的值 17 k=m/pow(10.0,len-1); 18 //从K*len的数值 0-9出现的次数 19 for(i=0;i<10;i++) count[i] += k*(len-1)*pow(10.0,len-2); 20 //在高位小于数值K的数字出现的次数 21 for(i=0;i<k;i++) count[i] += pow(10.0,len-1); 22 //在高位数值K出现的次数 23 count[k]+=m-k*pow(10.0,len-1)+1; 24 //去掉以计算的高位 25 m=m-k*pow(10.0,len-1); 26 } 27 //去掉前导0 28 for(i=0;i<L;i++)count[0] -= pow(10.0,i); 29 for(i=0;i<10;i++) printf("%d\n",count[i]); 30 } 31 return 0; 32 }
注释;