具體對於5! = 5 * 4 * 3 * 2 * 1 = 120
,結果有乙個0,原因是存在一對2 * 5 = 10
,對於10來說,只有2 * 5
可以構成,所以需要在階乘中查詢有多少對2 * 5
。
在看乙個例子:
11! = 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 11 * (2 * 5) * 9 * (4 * 2) * 7 * (3 * 2) * (1 * 5) * (2 * 2) * 3 * (1 * 2) * 1
對於含有2的因子:1 * 2
、2 * 2
、3 * 2
…
對於含有5的因子:1 * 5
、2 * 5
、3 * 5
…
含有2的因子每隔2個出現一次,含有5的因子每隔5個出現一次,所以2出現的次數遠比5出現的次數多,也就是說,對於每乙個5,總能找到乙個2與之對應,所以我們只需要找有多少個5
。
所以,我們需要判斷每個階乘的數中有多少個5
的因子
繼續分析
對於乙個數的階乘,5
說的因子一定是每隔5個出現一次,即:
n! = 1 * 2 * 3 * 4 * (1 * 5) * ... * (2 * 5) * ... * (3 * 5) *... * n
因為每隔5個數出現乙個5
,所以計算出現了多少個5,只需要用n / 5
計算。
但是,存在這種情況:25 = 1 * 5 * 5,50 = 2 * 5 * 5
,每隔25
個數,出現2個5
,所以除了每隔5個數算作乙個5
,每隔25個數,還需要多算乙個5
,也就是我們還需要加上n / 25
個5
。
同理,我們會發現125=1 * 5 * 5 * 5
,即每隔125
個數字,會出現3個5。
綜上,規律就是每隔5
個數,出現1
個5
,每隔25
個數,出現2
個5
,每隔125
個數,出現3
個5
… 以此類推。
最終5
的個數就是n / 5 + n / 25 + n / 125 ...
寫程式的話,如果直接按照上邊的式子計算,分母可能會造成溢位。所以算n / 25
的時候,我們先把n
更新,n = n / 5
,然後再計算n / 5
即可。後邊的同理。
func
trailingzeroes
(n int
)int
return count
}
172 階乘後的零
難度 簡單 題目描述 解題思路 產生0只可能是2 5,而且2的數量肯定比5多,所以只要找出所有乘數裡5因子的數量,就一定能找打同樣多的2和5配對形成0.所以問題可以簡化為找出5因子的數量。可以產生5的數字有 5,10,15,20,25等 要注意的是每個25都會產生兩個5,125產生3個5,以此類推 ...
Leetcode 總結 172 階乘後的零
q 給定乙個整數 n,返回 n 結果尾數中零的數量。示例 1 輸入 3輸出 0解釋 3 6,尾數中沒有零。示例 2 輸入 5輸出 1解釋 5 120,尾數中有 1 個零.說明 你演算法的時間複雜度應為 o log n 首先,時間複雜度應為 o log n 就說明會有比較大的數字出現,先暴力求解試一下...
階乘後的零 LeetCode 172
10進製數結尾的每乙個0都表示有乙個因數10存在,任何進製都一樣,對於乙個m進製的數,讓結尾多乙個0就等價於乘以m。10可以分解為2 5 因此只有質數2和5相乘能產生0,別的任何兩個質數相乘都不能產生0,而且2,5相乘只產生乙個0。所以,分解後的整個因數式中有多少對 2,5 結果中就有多少個0,而分...