n阶乘后面有多少个0

个人博客地址:http://xurui.club
开始整理下面试题和心得,这一部分包含Lintcode和平时遇到的一些题目。

题目描述:
给定一个正整数n,返回出n的阶乘尾部0的个数。linkcode链接:
https://lintcode.com/problem/trailing-zeros/description

分析:
看到这一题第一感觉先求阶乘,然后求出结果中尾部有多少0。
提交代码,超时。

于是查了下资料,一个数尾部有多少个0,先看这个数的因子,也就是因子分解,如10 分解为2 5,20 分解为2 2 5,100 分解为 2 2 5 5,多找几组数据,发现尾部0的个数为min{2的数,5的个数}。为什么会这样呢?因为尾部的0是由2*5得出的,当然也可以是4*5,但是4=2*2呀,最终0还是由2和5造出来的。一对2和5造出来一个0,n对2和5造出n个0,如果有10个2,8个5,则只能凑出8对,所以是min{…}.
阶乘也就是因子分解的过程,而且因子从小到大排好了。
2的个数肯定比5多,因为5大。
所以这个题,看因子中5出现的次数就可以啦。

这里n阶乘用n!表示。
5! –> 1 2 3 4 5 有一个5
10! –> 1 2 3 4 5 6 7 8 9 10 有2个5(10=2*5)

25! –> 1 2 3 4 5 …10 ..15 ..20 ..24 25 有6个5(25=5*5)

125! = 5 10 15 …25 ..50 ..75 ..100 ..125 有多少呢?
我们发现每隔5个数出现一个5,隔25个数多出来1个5..隔125个数再多出一个5
也就是从n个抽出5
5 10 15 20 25 30 … = 5(*1 2 3 4 5 )
然后从上面序列中再隔5抽
25 50 75 100 125 … = 5*5*(1 2 3 4 5 )
再隔5抽
125 250 375 500 625 .. = 5*5*5(1 2 3 4 5 )

规律很明显了

好了上代码 python3

class Solution:
    """
    @param: n: An integer
    @return: An integer, denote the number of trailing zeros in n!
    """
    def trailingZeros(self, n):
        zeros = 0
        while n > 0:
            zeros += n // 5
            n //= 5
        return int(zeros)

你可能感兴趣的:(interview)