1. 程式人生 > 其它 >[編號][1][刷題][LeetCode][腦筋急轉彎][中等][172. 階乘後的零]

[編號][1][刷題][LeetCode][腦筋急轉彎][中等][172. 階乘後的零]

題目描述

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

提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1

 

示例 1:

輸入:n = 3
輸出:0
解釋:3! = 6 ,不含尾隨 0
示例 2:

輸入:n = 5
輸出:1
解釋:5! = 120 ,有一個尾隨 0
示例 3:

輸入:n = 0
輸出:0
 

提示:

0 <= n <= 104
 

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/factorial-trailing-zeroes
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

 

我的思路:統計尾部0的個數->如果有則個位不能為0->個位不能為0則判斷什麼時候個位不為0:4!=24,5!=120,6!=120*6,7!=120*6*7....10!=120*6*7*8*9*10=6*7*8個1200 ->得出結論,其餘乘值不會影響末尾的0,而每出現一個10就會多一個0

所以我需要知道有多少個10->又因為10=2*5,所以需要知道有多少個2*5,2的個數足夠多,所以只需要統計5的個數即末尾0的個數。(檢視解答,還不錯符合標準答案。腦機急轉彎真麻煩)

答案程式碼:

class Solution {
public:
    int trailingZeroes(int n) {
        
int ans = 0; for (int i = 5; i <= n; i += 5) { for (int x = i; x % 5 == 0; x /= 5) { ++ans; } } return ans; } };

複雜度分析


  • 時間複雜度:O(n)n! 中因子 5 的個數為 O(n)

  • 空間複雜度:O(1)。

 

Leetcode官方列式計算:我看的時候,我草..

 

換一個角度考慮 [1,n] 中質因子 p的個數。[1,n] 中 p 的倍數有 n1=n/p⌋ 個

,這些數至少貢獻出了 n1個質因子 pp^2的倍數有 n2=⌊ n/p^2​ ⌋ 個,由於這些數已經是 p 的倍數了,為了不重複統計 p 的個數,我們僅考慮額外貢獻的質因子個數,即這些數額外貢獻了至少 n2​ 個質因子 p。依此類推,[1,n] 中質因子 p 的個數為k=1⌊n/p^k

 

 

class Solution {
public:
    int trailingZeroes(int n) {
        int ans = 0;
        while (n) {
            n /= 5;
            ans += n;
        }
        return ans;
    }
};

作者:LeetCode-Solution
連結:https://leetcode-cn.com/problems/factorial-trailing-zeroes/solution/jie-cheng-hou-de-ling-by-leetcode-soluti-1egk/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
View Code

 

 

 

總結

分析問題的時候需要細化問題,為了更好的解決可以進行列式解決問題。