問題描述:
給定乙個十進位制整數n,表示書的總頁碼數,計算書的頁碼中分別用到多少次數字0,1,2, ....,9。
如輸入11 得到 : 1,4,1,1,1,1,1,1,1,1
解法1:時間複雜度為 o(n* log n)
void handler(int *a, int i)
}int main(void)
{int a[11];
int n;
int i=0;
for(i=0;i<10;i++)
a[i]=0;
cin>>n;
for(i=1;i<=n;i++)
handler(a,i);
for(int k=0;k<10;k++)
cout<
解法2:時間複雜度為 o( log n)
分析如下:
由0到9組成的n位數,從n個0到n個9,在這10^n個n位數中,0,1,2,......,9 每個數字都使用相同次數,設為f(n)。
f(n)滿足:
10f(n-1) + 10^(n-1) n>1
f(n) =
1 n=1
所以,f(n)=n*10^(n-1)
舉例:假如書頁碼數為21345。則包含了2個 0000~9999區間,即 0000~9999和 10000~19999。每個數字出現次數為2*f(4)。而多餘的前導0出現在區間 0000~9999中。0000~0999中,有1000個。000~099中,有100個。00~09中,有10個。加上第乙個0。
最高位數字為1,出現了10000次。因為10000~19999。接著計算20000~21345,2出現了1346次。於是,著眼點就落在0000~1345中各數字的出現次數上,此時依照上面的取區間法,一次一次去掉最高位,直到剩下個位時為止。
SDNU 1014 書的頁碼問題
time limit 1000 ms memory limit 32768 kb total submission s 1109 accepted submission s 256 description 對於一本共有n頁的書,它的頁碼從1開始編號,一直到n,頁碼中沒有無用的0,則該書頁碼中分別共用...
演算法分析問題
演算法分析主要包括時間複雜度和空間複雜度。時間複雜度 可以有事前分析和事後測試兩種。事前分析通過計算程式步數來表示 事後測試需要在程式中加入計算時間的函式來統計。在這裡我採用的是clock 函式 該函式在標頭檔案 time.h 或者ctime下 分析結果如下 include includeusing...
sdnu1024 糾結的頁碼問題
1024.糾結的頁碼問題 time limit 1000 ms memory limit 32768 kb total submission s 230 accepted submission s 138 description 要期末考試了,陶陶在看書複習,看著看著就走神了,他注意到書的每頁都乙個...