3.參考部落格
一本書的頁碼從自然數1開始順序編碼直到自然數n。書的頁碼按照通常的習慣編排,每個頁碼都不含多餘的前導數字0。剛開始看到這道題,第乙個想到的解法就是暴力解法。利用從頁碼1開始到頁碼n的迴圈,對每乙個頁碼取其個位,十位,百位······,統計出現的0~9數字的個數,儲存在陣列當中。**如下:演算法設計:給定表示書的總頁碼的十進位制整數n(1≤n≤109),計算書的全部頁碼中分別用到多少次數字:0,1,2,····,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,...