演算法設計:給定表示書的總頁碼的十進位制整數n(1≤n≤10^9),計算書的全部頁碼中分別用到多少次數字數字0,1,2,…,9.
輸入:11
輸出:141
1111
11題解:數論+找規律
看到這種題,dfs把數重新組合複雜度比直接暴力列舉還要高,沒用。只能找規律,重新劃分區間才有可能。
首先根據排列組合原理,在不考慮前導0沒有意義的情況下,可以得到,0-9使用的次數是相等的,設f(n)代表當該數為n位時0-9使用的次數,這時需要找一下規律,然後根據高中所學的相加消元得到最終結果,上圖:
根據上圖,我們就可以整白或整千的劃分區間,怎麼劃分區間呢。比如3456,我們最好是0000-0999,1000-1999,2000-2999,三個區間。我們發現這三個區間除最高位其餘位都是相同的。同理找出規律區間個數的規律 區間個數=n/10^(len - 1);然後就能得出三個區間除最高位外0-9的個數。
剩餘的最高位怎麼處理呢?
0 1000次
1 1000次
2 1000次
3 456 + 1次
然後就把四位數的處理完了,直接遞迴處理456的就可以了。從高位到低位進行處理。
還需要特判一下比如2000或者20000101這種情況。
最後就是刪除前導0的情況。上圖:
//區間數
high = n / shu;
for(
int i =
0; i <
10; i++
)//劃分區間之後求個數
for(
int i =
0; i < high; i++
)//最高位
sy = n % shu;
if(sy ==0)
//判斷是否是整數,例如2000
len1 =
log10
(sy)+1
;if(len1 != len -1)
//判斷中間為零的情況,例:2000000212,處理中間0的情況。
a[high]+=
1+ sy;
return
suan
(sy);}
intmain()
//減去前導零
for(
int i =
0; i <=
9; i++
)return0;
}
數字統計問題
一本書的頁碼從自然數 1 開始順序編碼直到自然數 n。書的頁碼按照通常的習慣編排,每個頁碼都不含多餘的前導數字 0。例如,第 6 頁用數字 6 表示,而不是 06 或 006 等。數字計數問題要求對給定書的總頁碼 n,計算出書的全部頁碼中分別用到多少次數字0,1,2,9。程式設計任務 給定表示書的總...
數字統計問題
1 問題描述 一本書的頁碼從自然數1 開始順序編碼直到自然數n。書的頁碼按照通常的習慣編排,每個頁碼都不含多餘的前導數字0。例如,第6 頁用數字6 表示,而不是06 或006 等。數字計數問題要求對給定書的總頁碼n,計算出書的全部頁碼中分別用到多少次數字0,1,2,9。2 演算法設計 給定表示書的總...
統計數字問題
在王曉東編著的 演算法設計與實驗題解 中看到的這個問題,問題描述如下 一本書的頁碼從自然數1開始順序編碼直到自然數n。書的頁碼按照通常的習慣編排,每個頁碼都不含多餘的前導數字0。例如第6頁用6表示而不是06或006。數字統計問題要求對給定書的總頁碼,計算出書的全部頁碼中分別用到多少次數字0,1,2,...