问题描述:一本书的页码从自然数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 } 

方法二:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
 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 } 

 注释;

1-1 统计数字问题【计算机算法设计与分析】 算法 第1张1-1 统计数字问题【计算机算法设计与分析】 算法 第2张

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄