第2章 數字之魅 數字中的技巧2 2

2022-03-16 08:15:22 字數 2326 閱讀 8335

問題1:求 n!末尾有多少個0。

問題2:n!中二進位制表示中最低位1的位置。

首先對於問題1:

對於n!的末尾有多少個0這個問題。要追溯到算術基本定理:

任何乙個大於1的自然數

n,都可以唯一分解成有限個質數的乘積 n=(p_1^a1)*(p_2^a2)......(p_n^an) , 這裡p_1質數

,其諸方冪 ai 是正整數。

m = s*10^n = s*(2*5)*(2*5)*(2*5)...2*5有n隊。s尾部是不含0的。所以原問題就轉化為尋找n!中有多少對2和5的因子了。

也就是說尋找2和5的個數中哪個最少。取最少的那個(原先描述最少用最小,果斷容易引起誤解。)。對於這個問題。還有一步可以通過思維化簡問題的就是2和5的因子到底哪個更少呢?明顯是5的。所以我們要尋找數中5的因子的個數。

問題描述:尋找 n!中5的因子的個數。

法1:從數的角度

很常規的解法,將數除以5判斷是否能被5除盡。可以的話就計數。迴圈執行。

int

count;

int num = n!;

count = 0

;while

(num)

num /= 5

;}

法1觀察這個式子會發現模擬求二進位制中1的個數這個問題很像。對於這個問題,我們可以考慮一下。2的因子的個數其實就是最後乙個1後面的0的個數。

那麼我們是否可以用所謂的五進製呢?要將乙個數轉成乙個五進製數本身就耗費太多時間了。但是這是個好想法。學會模擬,這是很重要的。

同時這個角度有很大的缺陷,n!往往是很大的。所以我們經常是無法表達出來。

法2:從組合數的角度(結構)

組合數:n!= 1*2*3*4*5*...*n。

觀察會發現乙個很大的數構成一些小數乘積的結構。其中有一些數有乙個5的因子,比如5,10。其中有一些數有2個5的因子。比如25,125。其中有一些數字有3個,比如125。那麼按常規的。我們先找有多少個至少有1個5的因子的數。也就是說找1~n中有多少個能被5整除的數。

直接想並不容易。而用逆向思維地想。這些數一定是5*n。凡是5的倍數的就一定能被5整除。(廢話)

有1個的時候。n取值 [5,10)就是5.而[10,15)則是2個。那麼可以發現就是 [n/5]  "[ ]"代表取整。

之後我們再數有2個5的因子的數。再數有3個的。4個的。直到沒有。也就是[n/pow(5,k)]==0。

並且根據指數**。pow(5,k)增長是十分快的。演算法時間只需要log級別。而對於pow(5,k)我們可以考慮使用快速冪。

容斥定理:

在計數

時,必須注意無一重複

,無一遺漏

。為了使重疊

部分不被重複計算,人們研究出一種新的計數方法,這種方法的基本思想是:先不考慮重疊的情況,把包含於某內容

中的所有物件的數目

先計算出來,然後再把計數時重複計算的數目排斥

出去,使得計算的結果既無遺漏又無重複,這種計數

的方法稱為容斥原理

int

count;

count = 0

;void count(int

n)}

法2反思:我們要學會模擬。逆向思維的思考。(其實這個可以有利於dp的狀態轉移方程的思考)

然後對於問題2:

求n!的最低位的1的位置。最低位的1的位置不過就是1後面0的個數。那麼對於0的個數問題其實可以轉化為該數含有多少個2的因子的問題。通過問題1中所述的模擬。很簡單就可知。所以問題轉化為求n!的2的因子的個數問題。這個問題完全可以用上述的方法2來處理。而程式設計之美上又給出了乙個規律。 即1的位置 = n - n中1的個數。

推理過程:

乙個二進位制的數101001。

根據求法1,可以獲得 10100+1010+101+10+1

= 11111+111+1

= 100000-1+1000-1+1-1

= 10101-3.

觀察這個等式  10100+1010+101+10+1= 11111+111+1 對於11111 是由101001這個數最左邊的1向右邊移動而獲得的。

模擬的。111是由101001由左往的1 構成。而1就是由101001最右邊的1構成的。

而 11111正好是比原來的100000少1 所以就可以簡單發現這個規律的恆成立。其中包含了。二進位制的一些性質在內。

這個規律明顯是由法1得來的所以只對階乘數有效。

在這裡就不附上問題2的**了。

第2章 數字之魅 數字中的技巧2 1

法1 整型數觀念。二進位制中1在數中的體現,也就是當乙個數是奇數時最末位就是1。那麼我們可以將乙個數判斷是否是奇數。如果是就統計加1。並且 2 失去這一位。int count count 0 void count int num num 2 法1法2 從二進位制的角度。利用位運算。從二進位制的角度對...

第2章 數字之魅 區間重合判斷

具體 如下 1 package chapter2shuzizhimei.qujianchonghe 2 3 區間重合判斷4 author dell5 6 7public class intervaloverlap 16 1718 快速排序的一次劃分 19public static int parti...

第2章 數字之魅 子陣列的最大乘積

給定乙個長度為n的整數陣列,只允許用乘法,不能用除法,計算任意 n 1 個數的組合乘積中最大的一組,並寫出演算法的時間複雜度。我們把所有可能的 n 1 個數的組合找出來,分別計算它們的乘積,並比較大小。由於總共有n個 n 1 個數的組合,總的時間複雜度為o n2 但顯然這不是最好的解法。具體 如下 ...