學習筆記 1 1 統計數字問題

2021-10-09 19:06:06 字數 2726 閱讀 1783

3.參考部落格

一本書的頁碼從自然數1開始順序編碼直到自然數n。書的頁碼按照通常的習慣編排,每個頁碼都不含多餘的前導數字0。

演算法設計:給定表示書的總頁碼的十進位制整數n(1≤n≤109),計算書的全部頁碼中分別用到多少次數字:0,1,2,····,9。

剛開始看到這道題,第乙個想到的解法就是暴力解法。利用從頁碼1開始到頁碼n的迴圈,對每乙個頁碼取其個位,十位,百位······,統計出現的0~9數字的個數,儲存在陣列當中。**如下:

n:總頁碼

a[10]:存放結果

//統計數字問題

//暴力解題

#include

using

namespace std;

intmain()

;//n為總頁碼,陣列a存放結果並進行初始化

cin>

>n;

for(i=

1; i<=n; i++)}

for(i=

0; i<

10; i++

) cout<

<

//輸出結果

return0;

}

此方法解題思路比較簡單,容易想到,但是如果問題的規模增大,耗費的時間將會很多,時間複雜度為o(nlogn)。

即採用《計算機演算法設計與分析》習題解答中的思路解題。

分析與解答:考察由0,1,2,····9組成的所有n位數。從n個0到n個9一共有10n個n為數。在這10n個n位數中,0,1,2,····9每個數字使用的次數相同,設為f(n)。f(n)=n10n-1

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

題解的意思即是n位的所有數(從00··0~99··9,每個數有n位),n位的所有的數,出現的單個數字的總數為n10n,而因為0,1,2···9每個數字出現的概率相同,故每個數字出現次數都為n10n/10=n10n-1。(包括前導0)

舉個例子,

例如總頁碼為4151,按照題解的思路,就是把4151分成:0000-0999,1000-1999,2000-2999,3000-3999,4000-4151幾個部分。而遞迴即是在求出0000-3999各個數字出現的次數,和4151最高位數字4作為最高位出現的次數後,再用相同的方法求4151中的151部分各個數字出現的次數,遞迴呼叫直至頁碼位數為1,這時就求出了包括前導0的各數字的出現次數。

而在計算前導零個數時,其實我們只要計算從0000-3999這些數**現的前導零的個數即可,計算時用迴圈解決,如下方**。

**如下:

n:總頁碼;

bit:總頁碼位數;

a[10]:存放結果;

b:總頁碼位數-1;

high:總頁碼最高位的數字

last:除去總頁碼最高位數字後的數

c:00···0~99···9(共b位)中各個數字出現的次數×high

c_zero:前導0的個數

//統計數字問題

//書中思路,遞迴實現

#include

#include

using

namespace std;

void

statistic

(int n,

int bit,

int a)

//計算各個數字出現(包括前導0)的個數

}void

del_zero

(int bit,

int a)

//多餘零計算

void

output

(int a)

//輸出結果

intmain()

; cin>>n;

bit=

(int

)log10

(n)+1;

//計算輸入的總頁碼的位數

statistic

(n, bit, a)

;del_zero

(bit, a)

;output

(a);

return0;

}

:現有部分數字統計個數錯誤的情況,而這些錯誤答案與正確答案相差並不多。經過我多次思考自己**的思路和過程,堅信自己**邏輯上沒有一點問題。而最後通過在網上看一些相關的部落格,發現是pow()函式精度所導致的問題,不得不說有點坑。於是就使用round()函式進行修改,最後得到正確執行結果。

① 1-統計數字問題(詳解)

② pow()函式的精度問題

1 1 統計數字問題

題解 000.0 999.9 n個9 則0 9中每個數字出現的次數都是n 10 n 1 即每個數字出現次數相同。但是因為不含前導0.所以要把多算的0給去掉。具體的,設n這個數字的長度為l,則需要減去1111.1 l個1 個多餘的0.然後做個數字dp就好。詳見 include include incl...

1 1統計數字問題(詳解)

題目描述 從1頁到n頁,統計0到9出現的次數 include include includeusing namespace std int main int n cin n for int i 1 i n i for int i 0 i 9 i 這個公式可以這麼理解 當n 21時,要減去的0有 10...

統計數字問題

在王曉東編著的 演算法設計與實驗題解 中看到的這個問題,問題描述如下 一本書的頁碼從自然數1開始順序編碼直到自然數n。書的頁碼按照通常的習慣編排,每個頁碼都不含多餘的前導數字0。例如第6頁用6表示而不是06或006。數字統計問題要求對給定書的總頁碼,計算出書的全部頁碼中分別用到多少次數字0,1,2,...