Lintcode第二題

這是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

複製代碼
相關文章
相關標籤/搜索