(1)
階乘確實是乙個讓人頭疼的問題,其本身的實現很簡單,它的問題在於結果膨脹式的增長會造成n!的結果的溢位。2.2給出了幾種從數學角度出來的思路,可以避免上面的問題發生。
首先要清楚的乙個問題就是質因數分解:給定任意乙個整數w,那麼w一定可以分解成w=2^x * 3^y * 5^m……這種形式,這個數學理論是解決此類問題的關鍵。
接著分析因為10進行質因數分解的結果為 10 = 2 * 5, 所以每一對2和5相乘就會在其n!的末尾新增上乙個0,因而n!末尾0的個數同2、5的對數相同,即末尾0的個數count = min(x,m);
其實分析到這裡可以先得出乙個解法了就是分別統計2和5的冪然後比較哪個比較小,min的值便是我們要取得值。
但是書中又講到了乙個不是定理的定理:在階乘n!的質因數分解中2的指數不會小於5的指數。因而這個問題直接便轉化為求5的指數,具體做法很容易詳情見解法一書中;
很明顯解法一的時間複雜度是o(nlog5n),這個演算法在很大程度上還是取決於n的大小;
解法2是乙個很精彩的做法,時間複雜度優化到了o(log5n),階乘n!中最後乙個數n反應了前面數的一些基本情況,比如說21/5=4說明就是在21之前一共出現過4次5,這樣就避免了遍歷一遍n的時間。又比如25/5=5,這說明從1到25已經出現了5個5,且結果還是5說明25是兩個5相乘得到的,所以是1+1+1+1+2=6,解法二已經是這個問題的極限優化解法。
判斷n!可以被數k整除多少次?
num = [n/5] + [n/5^2] + …… + [n/5^m],n/5^m = 0
(2)其實(1)和(2)是本質相同的兩個問題,(2)就是找到在n!的質因數分解中2的指數。
程式設計之美 2 2 階乘
題目1 找出n 中末尾0的個數。include 輸入n 輸出n 中末尾0的個數 分析 只需要知道n 中質因子5出現了多少次 因為2 5 10 因子2比5多 只需要關注5 方法1 對1.n的每個數字 迴圈除以5 相加得到總共因子5的個數 注意 像25這樣的數字提供了2個5 int numofzero1...
程式設計之美2 2 不要被階乘嚇倒
對n 進行質因數分解,n 可以分解成2 x 3 y 5 z 只有2 5才會使n 的末尾產生1個0,也就是說n 的質因數分解中有多少個2,5對末尾就有多少個0,而n 的質因數中5的個數要少於2的 個數,也就是說2,5對的個數取決於質因中5的個數,所以問題轉化為求n 中質因數5的個數 5的個數z n 5...
程式設計之美 2 2 不要被階乘嚇倒
題目 1.給定乙個整數n,那麼n的階乘n!末尾有多少個0?2.求n 的二進位制表示中最低位1的位置。分析與解答 對於題目1 最簡單直接的方法,算出n!再看10的倍數關係。複雜度雖然不高,但致命的問題是溢位。在n不到100的時候就會引起溢位,所以雖然這是乙個正確的方法,但在實際中卻不能使用。這時就需要...