172. Factorial Trailing Zeroes

题目来自leetcode

Given an integer n, return the number of trailing zeroes in n!.

Note: Your solution should be in logarithmic time complexity.

在logn的时间内 找到n!末尾有几个零

首先,要清楚 n!末尾有几个零是由这个数字的质因子中有几个成对的2 和5 决定的。我们又知道n! = n(n-1)(n-2)...... 1 ,不难看出随着n的增大,n!中质因子2要比5多的多!

那么我们可以计算n的数量,这个数量就是末尾0的值!

        counter = 0
        while n > 0:
        temp = n
            while temp % 5 == 0:
                counter =  counter + 1
                temp = temp / 5
            n = n - 1

上面的算法就可以得到,但是很明显超时

while循环中有很多不能被2 5 整除的数
逐渐发现到
存在这样的规律:[n/k]代表1~n中能被k整除的个数。

然后,代码就可以

#coding = utf-8

class Solution:
    # @return an integer
    def trailingZeroes(self, n):
        counter = 0
        if n == 0:
            return 0

        # while n > 0:
        # temp = n
        #     while temp % 5 == 0:
        #         counter =  counter + 1
        #         temp = temp / 5
        #     n = n - 1

        # return counter

        while n != 0:
            counter += n/5;
            n /= 5;
        return counter

成功

你可能感兴趣的:(172. Factorial Trailing Zeroes)