1-1 統計數字問題【計算機算法設計與分析】


問題描述:一本書的頁碼從自然數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 } 

 注釋;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM