這是Lintcode第二題,原題在此 尾部的零。題目雖然標爲「簡單」,但答對率卻不高。python
看到這一題,比較直觀的想法是計算從1到n的連乘,但這樣很容易溢出,由於乘起來的數字太大。算法
換一個思路,咱們將n階乘作質因數分解,將n階乘表示成spa
其中a, m, n都是非負整數,且a不能被2和5整除。code
上面的表達式中,每一對2和5都貢獻了一個末尾的零,因此咱們只要知道n的階乘中有多少個因子2,有多少個因子5,求二者的最小值 cdn
就是末尾零的個數了。咱們先來看一下n的階乘有多少個因子5。get
從1到n中,每個5的倍數都至少貢獻了一個5,好比數字5,10,15,都貢獻了一個5。每一個 it
的倍數都至少貢獻了兩個5,好比數字25,50。因此n的階乘中包含的5的因子的個數,能夠用下面的表達式來計算一樣的,n的階乘包含的2的因子的個數能夠用下面的表達式計算io
很顯然 m > k。前面說過,末尾零的個數是 function
也就是k了。理解了上面的步驟,接下來就能夠用代碼來實現算法了,以下class
def trailing_zero_num(n):
num = 0
while True:
n = int(n / 5)
if n == 0:
break
num = num + n
return num
複製代碼