172 階乘後的零

2021-10-01 13:18:37 字數 1886 閱讀 4763

具體對於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 * 22 * 23 * 2

對於含有5的因子:1 * 52 * 53 * 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 / 255

同理,我們會發現125=1 * 5 * 5 * 5,即每隔125個數字,會出現3個5。

綜上,規律就是每隔5個數,出現15,每隔25個數,出現25,每隔125個數,出現35… 以此類推。

最終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,而分...