數字統計問題

2021-10-09 15:56:31 字數 1562 閱讀 5449

演算法設計:給定表示書的總頁碼的十進位制整數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,...