leetcode 172 階乘後的零

2021-10-23 21:49:14 字數 1122 閱讀 6823

給定乙個整數 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,求所...