給定乙個整數 n,返回 n! 結果尾數中零的數量。
示例 1:
輸入: 3
輸出: 0
解釋: 3! = 6, 尾數中沒有零。
示例 2:
輸入: 5
輸出: 1
解釋: 5! = 120, 尾數中有 1 個零.
說明: 你演算法的時間複雜度應為 o(log n) 。
解析:本題肯定不能把階乘算出來然後數,憑藉階乘的**式增長,很快便會發生溢位。
我們以5為例進行分析
5! = 5 * 4 * 3 * 2 * 1 = 120
階乘尾數的零,來自其中的每乙個10
而每乙個10,僅可能來自2 * 5
而階乘中偶數的數量佔了一半,而2的數量更多,必然多於5的數量
因此我們可以僅僅考慮階乘中的5。
列舉乙個更大的階乘
10! = 10(2 * 5) * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 3628800
對其中的每乙個數字進行分解,不難發現其中總共有兩個5
而尾數也有兩個0.
因此判斷尾數有幾個零,只要判斷這個階乘分解出來的乘法因子總共有多少個5即可。
仍然以10為例子,我們直接將這個數除以5
10 / 5 = 2
恰好即為尾數後面零的個數
這裡除5的意義是得到10的階乘中,有2個數字可以被5整除,即可以分解出乘法因子5
但是如果擴充套件到25的階乘
25 / 5 = 5
但其實25的階乘末尾有6個零
這是因為25除5得到5,僅僅說明25的階乘中,有5個數字可以被5整除,但25本身可以分解成5*5,所以完全分解之後的乘法因子中總共有6個5。
因此我們需要迴圈相除。
25/5得到的5,這個5可以翻譯成這樣的集合,即所有5的倍數除以5後剩下的餘數,我們需要繼續判斷其中是否存在5的倍數
我們繼續對其除以5
5 / 5 = 1
將這些結果相加即可得到乘法因子5的總數量,即階乘尾數0的數量。
本題**十分簡單,但是怎樣理解是重點難點所在
class
solution
return res;}}
;
階乘後的零 LeetCode 172
10進製數結尾的每乙個0都表示有乙個因數10存在,任何進製都一樣,對於乙個m進製的數,讓結尾多乙個0就等價於乘以m。10可以分解為2 5 因此只有質數2和5相乘能產生0,別的任何兩個質數相乘都不能產生0,而且2,5相乘只產生乙個0。所以,分解後的整個因數式中有多少對 2,5 結果中就有多少個0,而分...
LeetCode 172 階乘後的0
乙個數n,他的階乘n 的尾數裡面有多少0.0的出現就是2和5組成的。也就是看1 n這n個數字中,各有多少個2和5的配對。考慮到2的數字肯定比5多,所以只用考慮有多少個5即可。比如31這個數字,31沒有5的組合,但是30有,25有,20有 5有。class solution def trailingz...
leetcode 172 階乘後的零
給定乙個整數 n,返回 n 結果尾數中零的數量。示例 1 輸入 3 輸出 0 解釋 3 6,尾數中沒有零。示例 2 輸入 5 輸出 1 解釋 5 120,尾數中有 1 個零.說明 你演算法的時間複雜度應為 o log n 此篇文章並不是講這個題,而是總結一下學習到的乙個知識點 對於乙個正整數n,求所...