亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

關于統計數字問題的算法

2020-05-23 14:16:22
字體:
來源:轉載
供稿:網友

本文介紹了統計數字問題的算法,計算出書的全部頁碼中分別用到多少次數字0,1,2,3,.....9,并有每一步的解題思路,需要的朋友可以參考下

一本書的頁碼從自然數1開始順序編碼直到自然數n。書的頁碼按照通常的習慣編排,每個頁碼都不含多余的前導數字0。例如第6頁用6表示而不是06或006。數字統計問題要求對給定書的總頁碼,計算出書的全部頁碼中分別用到多少次數字0,1,2,3,.....9。

這個題目有個最容易想到的n*log10(n)的算法。這是自己寫的復雜度為O(n*log10(n))的代碼:

 

 
  1. void statNumber(int n) { 
  2. int i, t; 
  3. int count[10] = {0}; 
  4. for(i = 1; i <= n; i++) { 
  5. t = i; 
  6. while(t) { 
  7. count[t%10]++; 
  8. t/=10; 
  9. for(i = 0; i < 10; i++) { 
  10. printf("%d/n", count[i]); 

仔細考慮m個n位十進制數的特點,在一個n位十進制數的由低到高的第i個數位上,總是連續出現10^i個0,然后是10^i個1……一直到10^i個9,9之后又是連續的10^i個0,這樣循環出現。找到這個規律,就可以在常數時間內算出第i個數位上每個數字出現的次數。而在第i個數位上,最前面的10^i個0是前導0,應該把它們減掉。

這樣,可以只分析給定的輸入整數n的每個數位,從面可以得到一個log10(n)的算法,代碼如下:

 

 
  1. void statNumber(int n) { 
  2. int m, i, j, k, t, x, len = log10(n); 
  3. char d[16]; 
  4. int pow10[12] = {1}, count[10] = {0}; 
  5. for(i = 1; i < 12; i++) { 
  6. pow10[i] = pow10[i-1] * 10; 
  7. sprintf(d, "%d", n); 
  8. m = n+1; 
  9. for(i = 0; i <= len; i++) { 
  10. x = d[i] - '0'
  11. t = (m-1) / pow10[len-i];  
  12.  
  13. count[x] += m - t * pow10[len-i];  
  14.  
  15. t /= 10; 
  16. j = 0; 
  17. while(j <= x-1) { 
  18. count[j] += (t + 1) * pow10[len-i]; 
  19. j++; 
  20. while(j < 10) { 
  21. count[j] += t * pow10[len - i]; 
  22. j++; 
  23. count[0] -= pow10[len-i]; /* 第i個數位上前10^i個0是無意義的 */ 
  24. for(j = 0; j < 10; j++) { 
  25. printf("%d/n", count[j]); 

通過對隨機生成的測試數據的比較,可以驗證第二段代碼是正確的。

對兩段代碼做效率測試,第一次隨機產生20萬個整數,結果在我的電腦上,第二段代碼執行1.744秒。第一段代碼等我吃完鈑回來看還是沒反應,就強行關了它。

第二次產生了1000個整數,再次測試,結果第一段代碼在我的電腦上執行的時間是

10.1440秒,而第二段代碼的執行時間是0.0800秒。

其原因是第一段代碼時間復雜度為O(n*log10(n)),對m個輸入整數進行計算,則需要的時間為 1*log10(1) + 2*log10(2) + ... + m*log10(m), 當n > 10時,有

n*log10(n) > n,所以上式的下界為11+12+....+m,其漸近界為m*m。對于20萬個測試數據,其運行時間的下界就是4*10^10。

同樣可得第二段代碼對于n個輸入數據的運行時間界是n*log10(n)的。

上面的代碼中有個pow10數組用來記錄10^i,但10^10左右就已經超過了2^32,但是題目給定的輸入整數的范圍在10^9以內,所以沒有影響。

原著中給出的分析如下:

考察由0,1,2...9組成的所有n位數。從n個0到n個9共有10^n個n位數。在這10^n個n位數中,0,1,2.....9第個數字使用次數相同,設為f(n)。f(n)滿足如下遞推式:

n>1:

f(n) = 10f(n-1)+10^(n-1)

n = 1:

f(n) =1

由此可知,f(n) = n*10^(n-1)。

據此,可從高位向低位進行統計,再減去多余的0的個數即可。

著者的思想說的更清楚些應該是這樣:

對于一個m位整數,我們可以把0到n之間的n+1個整數從小到大這樣來排列:

000......0

.............

199......9

200......0

299......9

.........

這樣一直排到自然數n。對于從0到199......9這個區間來說,拋去最高位的數字不看,其低m-1位恰好

就是m-1個0到m-1個9共10^(m-1)個數。利用原著中的遞推公式,在這個區間里,每個數字出現的次數

(不包括最高位數字)為(m-1)*10^(m-2)。假設n的最高位數字是x,那么在n之間上述所說的區間共有

x個。那么每個數字出現的次數x倍就可以統計完這些區間。再看最高位數字的情況,顯然0到x-1這些

數字在最高位上再現的次數為10^(m-1),因為一個區間長度為10^(m-1)。而x在最高位上出現次數就是

n%10^(m-1)+1了。接下來對n%10^(m-1),即n去掉最高位后的那個數字再繼續重復上面的方法。直到

個位,就可以完成題目要求了。

比如,對于一個數字34567,我們可以這樣來計算從1到34567之間所有數字中每個數字出現的次數:

從0到9999,這個區間的每個數字的出現次數可以使用原著中給出的遞推公式,即每個數字出現4000次。

從10000到19999,中間除去萬位的1不算,又是一個從0000到9999的排列,這樣的話,從0到34567之間

的這樣的區間共有3個。所以從00000到29999之間除萬位外每個數字出現次數為3*4000次。然后再統計

萬位數字,每個區間長度為10000,所以0,1,2在萬位上各出現10000次。而3則出現4567+1=4568次。

之后,拋掉萬位數字,對于4567,再使用上面的方法計算,一直計算到個位即可。

下面是自己的實現代碼:

 

 
  1. void statNumber_iterative(int n) { 
  2. int len, i, k, h, m; 
  3. int count[10] = {0}; 
  4. int pow10[12] = {1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000}; 
  5. char d[16]; 
  6. len = log10(n); /* len表示當前數字的位權 */ 
  7. m = len; 
  8. sprintf(d, "%d", n); 
  9. k = 0; /* k記錄當前最高位數字在d數組中的下標 */ 
  10. h = d[k] - '0'/* h表示當前最高位的數字 */ 
  11. n %= pow10[len]; /* 去掉n的最高位 */ 
  12. while(len > 0) { 
  13. if(h == 0) { 
  14. count[0] += n + 1; 
  15. h = d[++k] - '0'
  16. --len; 
  17. n %= pow10[len]; 
  18. continue
  19. for(i = 0; i < 10; i++) { 
  20. count[i] += h * len * pow10[len-1]; 
  21. for(i = 0; i < h; i++) { 
  22. count[i] += pow10[len]; 
  23. count[h] += n + 1; 
  24. --len; 
  25. h = d[++k] - '0'
  26. n %= pow10[len]; 
  27. for(i = 0; i <= h; i++) { 
  28. count[i] += 1; 
  29. /* 減去前導0的個數 */ 
  30. for(i = 0; i <= m; i++) {  
  31. count[0] -= pow10[i]; 
  32. for(i = 0; i < 10; i++) { 
  33. printf("%d/n", count[i]); 

以上就是本文的全部內容,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人剧情片在线观看| 91av在线国产| 欧美精品videossex88| 在线国产精品视频| 在线播放国产一区中文字幕剧情欧美| 播播国产欧美激情| 成人黄色免费在线观看| 日韩成人激情在线| 91精品久久久久久久久| 久久琪琪电影院| 久久精品人人爽| 在线激情影院一区| 日韩在线视频播放| 国产精品久久久久久久久免费| 日韩精品一二三四区| 欧美激情亚洲自拍| 日韩免费在线视频| 久久久久久网址| 69视频在线播放| 成人av电影天堂| 日韩av免费在线观看| 深夜精品寂寞黄网站在线观看| 成人网在线免费观看| 97精品一区二区视频在线观看| 日韩欧美主播在线| 欧美成人亚洲成人| 亚洲欧洲在线播放| 国产成人精品午夜| 久久久噜噜噜久久中文字免| 国产亚洲精品久久久优势| 国产视频精品va久久久久久| 国产精品视频最多的网站| 国产亚洲成av人片在线观看桃| 国产成人精品一区二区在线| 91亚洲国产成人精品性色| 一本一道久久a久久精品逆3p| 91精品在线观看视频| 亚洲国内精品视频| 欧美一级高清免费播放| 欧美性色19p| 亚洲视频电影图片偷拍一区| 国产成人精品免高潮在线观看| 欧美性理论片在线观看片免费| 欧美精品videos| 亚洲欧洲日产国码av系列天堂| 国产成人高清激情视频在线观看| 成人在线精品视频| 亚洲直播在线一区| 亚洲变态欧美另类捆绑| 国产欧美精品va在线观看| 一本大道亚洲视频| 久久久久99精品久久久久| 久久91亚洲精品中文字幕奶水| 日韩中文字幕不卡视频| 国语自产精品视频在线看| 日韩久久精品电影| 色综合伊人色综合网站| 日韩精品视频免费专区在线播放| 日韩精品在线私人| 亚洲香蕉成人av网站在线观看| 日本高清视频一区| 97精品一区二区视频在线观看| 国产69精品久久久| 日韩中文字在线| 亚洲aaaaaa| 欧美一区二三区| 日韩欧美国产激情| 日韩欧美在线免费观看| 中文精品99久久国产香蕉| 北条麻妃一区二区三区中文字幕| 2019中文在线观看| 国产精品久久久久久久9999| 欧美日韩国产限制| 亚洲2020天天堂在线观看| 91精品国产综合久久香蕉的用户体验| 欧美一级高清免费| 57pao成人永久免费视频| 国产精品三级在线| 最近2019中文字幕大全第二页| 亚洲精品午夜精品| 欧美做受高潮电影o| 永久免费精品影视网站| 久久精品亚洲一区| 久久久久久久久网站| 国产日韩综合一区二区性色av| 亚洲男人天堂久| 欧美老女人bb| 色妞久久福利网| 欧美激情亚洲自拍| 欧美理论电影在线观看| 欧美亚洲免费电影| 中文字幕日韩视频| 国产日韩欧美中文| 中文字幕在线成人| 国模精品一区二区三区色天香| 欧美又大又粗又长| 亚洲在线观看视频网站| 91精品视频大全| 爱福利视频一区| 欧美性生活大片免费观看网址| 久久视频免费观看| 亚洲精品v欧美精品v日韩精品| 国产精品视频免费在线| 91精品视频在线| 欧美激情在线狂野欧美精品| 欧美国产日韩中文字幕在线| 亚洲欧美日韩图片| 色吧影院999| 国产精品爽黄69天堂a| 日本一区二区在线播放| 九九热这里只有在线精品视| 亚洲国产精品大全| 亚洲福利视频网站| 国产精品久久久久久久久久东京| 亚洲精品一区二区三区婷婷月| 狠狠色狠狠色综合日日小说| 色综合久综合久久综合久鬼88| 久久艹在线视频| 亚洲欧洲成视频免费观看| 日韩国产激情在线| 久久精品视频中文字幕| 日韩在线视频观看正片免费网站| 久久久av电影| 欧美电影第一页| 国产精品国产亚洲伊人久久| 精品中文字幕久久久久久| 97超碰蝌蚪网人人做人人爽| 亚洲人成毛片在线播放| 欧美大尺度激情区在线播放| 国产欧亚日韩视频| 亚洲成人激情在线观看| 成人精品视频99在线观看免费| 欧美精品久久久久| 中文字幕在线看视频国产欧美在线看完整| www.日韩不卡电影av| 2021久久精品国产99国产精品| 九九热这里只有精品免费看| 欧美乱大交xxxxx另类电影| 97视频com| 日韩美女免费观看| 91久久久久久久| 欧美—级a级欧美特级ar全黄| 欧美激情一区二区三区在线视频观看| 亚洲精美色品网站| 最近更新的2019中文字幕| 国内精品一区二区三区四区| 亚洲国产天堂久久国产91| 久久久欧美精品| 日韩国产高清视频在线| 久久精品国产久精国产一老狼| 97久久超碰福利国产精品…| 韩国美女主播一区| 欧美激情精品久久久| 亚洲加勒比久久88色综合| 欧美中文字幕在线视频| 欧美理论片在线观看| 亚洲日本中文字幕免费在线不卡| 国产精品丝袜视频| 成人免费直播live| 理论片在线不卡免费观看| 91高潮精品免费porn| 日韩av影片在线观看| 亚洲一区二区三区毛片| 日韩在线免费高清视频|