1. 程式人生 > >Leetcode 172:階乘後的零(超詳細的解法!!!)

Leetcode 172:階乘後的零(超詳細的解法!!!)

給定一個整數 n,返回 n! 結果尾數中零的數量。

示例 1:

輸入: 3
輸出: 0
解釋: 3! = 6, 尾數中沒有零。

示例 2:

輸入: 5
輸出: 1
解釋: 5! = 120, 尾數中有 1 個零.

說明: 你演算法的時間複雜度應為 O(log n) 。

解題思路

首先想到的就是暴力解法。將階乘算出來,然後計算尾數有多少個零即可。

import math
class Solution:
    def trailingZeroes(self, n):
        """
        :type n: int
        :rtype: int
        """
fac = math.factorial(n) res = 0 while fac: if fac % 10 == 0: res += 1 else: break fac //= 10 return res

但是這種做法在輸入數較大的時候就超時了。有什麼更好的解法呢?

我們發現題目的問題是尾數有多少個零,這就很有講究了。首先5*2=101*10=10

,也就是對於10!結尾必然會有兩個0,那麼有什麼規律呢?我們發現10又可以看成是2*5,所以歸根結底還是要看5有多少個,這就很簡單了n//5即可。但是計算100!的時候發現少計算了個數,在哪呢?O(∩_∩)O哈哈~在25的時候,我們將25=5*5,所以應該時會有兩個零才對(因為2的數量有很多,你看16就有四個2了,原因在於2<5,所以同樣大的數,必然其中包含2的數量大於5)。以此類推,對於5**n都要做處理。那麼這個問題就很簡單了

class Solution:
    def trailingZeroes(self, n):
        """
        :type n: int
        :rtype: int
        """
res, k = 0, 5 while k <= n: res += n//k k *= 5 return res

遞迴寫法。

class Solution:
    def trailingZeroes(self, n):
        """
        :type n: int
        :rtype: int
        """
        return 0 if n == 0 else n // 5 + self.trailingZeroes(n // 5)

我將該問題的其他語言版本新增到了我的GitHub Leetcode

如有問題,希望大家指出!!!