LeetCode 172. Factorial Trailing Zeroes 階乘後的零

題目描述

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

示例 1:

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

輸入: 5
輸出: 1
解釋: 5! = 120, 尾數中有 1 個零.
說明: 你算法的時間複雜度應爲 O(log n) 。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/factorial-trailing-zeroes

思路

求某個數的階乘有多少個0.
我們知道要想產生10只能是因子2與5相乘。要想產生因子2比較簡單,只要是偶數就行;而產生因子5只能是5的倍數例如5、10、15、20…由此可知我們不用考慮怎麼產生2
(因爲2實在是太多了,每個一個數就有一個,而5則需要每隔4個數纔有一個)。
所以題目轉換成1-n這n個數因式分解後有多少個5。很明顯5的倍數至少有一個5的因子,但是我們需要注意到25、50等等其實是蘊含了兩個5的因子,125、250等蘊含了三個5的因子…
例子:
n = 4617.
5^1 : 4617 ÷ 5 = 923.4, 所以一共得到923個因子5;
5^2 : 4617 ÷ 25 = 184.68, 所以又得到額外的184個因子5;
5^3 : 4617 ÷ 125 = 36.936, 所以又得到額外的36個因子5;
5^4 : 4617 ÷ 625 = 7.3872, 所以又得到額外的7個因子5;
5^5 : 4617 ÷ 3125 = 1.47744, 所以又得到額外的1個因子5;
5^6 : 4617 ÷ 15625 = 0.295488, 結果小於1,停止循環。
所以 4617! 有 923 + 184 + 36 + 7 + 1 = 1151 個尾0.
參考

C++

class Solution {
public:
    int trailingZeroes(int n) {
        return n/5==0 ? n/5 : n/5 + trailingZeroes(n/5);
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章