LeetCode 階乘後的零

2021-08-26 23:57:10 字數 1314 閱讀 9959

一. 題目描述

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

示例 1:

輸入: 3

輸出: 0

解釋: 3! = 6, 尾數中沒有零。

示例 2:

輸入: 5

輸出: 1

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

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

二. 解法

老實說, 這道題, 博主並沒有做出來, 是抄的部落格大神的答案提交的,所以,仔細研究一下之後,覺得這道題還是挺有意思的,特地寫下來,記錄分享一下。

class solution 

return count;

}}

三. 解析

1. 先吐槽一下, **簡單得令人髮指,而且時間複雜度也達到了要求,我的**分分鐘時間超限。

2. 為什麼能夠這麼寫呢? 首先, 要明白這道題的第乙個關鍵是,明確,在1-9之間,只有2*5=10的尾數為0。所以,第乙個方向就是處理2和5的倍數。(那我7*10=70的尾數也是0呀。 其實這麼說也沒有毛病,但是我們選擇用4*10這樣的操作,這樣能夠統一我們的演算法。)

3. 2和5一起決定了尾數0的數量,很明顯乙個地方,5的數量明顯少於2,那麼,關鍵就在處理5的倍數了。

4. 5! 有乙個5, 尾數0的數量為1, 10! 有兩個5的倍數, 尾數0的數量為2, ... , 25!有5個5的倍數,尾數0的數量為6。咦?咦?咦?這,咋回事。這跟前面的小夥伴們並不一樣呀。

5. 好了,這就是第二個關鍵的地方了,為什麼25!的0尾數有6個,這是因為25 = 5 * 5,所以,25是包含2個5的,那麼加上前面4個5的倍數,總共就有6個5的倍數了。

6. 以上的理順之後,我們開始理解**,發現**是不斷地對5做除法, 然後將商累加起來,作為最後的結果。

7. 我們輸入乙個n,  k1 = n / 5,  k1 就等於1-n中,為5的倍數的數字數量。但是如果1-n中包含了25的倍數的數字,那麼這些數字明顯包含了2個5,我們需要計算 k2 = n/25, k2就等於1-n中,為25的倍數的數字數量。但是如果1-n中包含了125的倍數的數字,那麼這些數字明顯包含了3個5,我們需要計算 k3 = n/125, k3 就等於1-n中,為125的倍數的數字數量。.... 一次類推, 我們不斷除以更大的5的倍數,知道發現計算出來的ki = 0的時候,我們停止計算。

8. 7中的計算流程明顯很冗餘, 我們只需要按照**中的方式,不斷地除以5,並累和每一次的商, 就是結果了。

LeetCode 階乘後的零

給定乙個整數 n,返回 n 結果尾數中零的數量。示例 1 輸入 3 輸出 0 解釋 3 6,尾數中沒有零。示例 2 輸入 5 輸出 1 解釋 5 120,尾數中有 1 個零.說明 你演算法的時間複雜度應為 o log n 思路分析 不難發現,只用出現2的倍數 5的倍數相乘才會在末尾出現零。並且2的倍...

leetcode 階乘後的零

給定乙個整數 n,返回 n 結果尾數中零的數量。示例 1 輸入 3 輸出 0 解釋 3 6,尾數中沒有零。示例 2 輸入 5 輸出 1 解釋 5 120,尾數中有 1 個零.說明 你演算法的時間複雜度應為 o log n 本題如果暴力乘計數的話必然會爆範圍,因為數字增長的速度太快了 其實乘法裡面,末...

LeetCode 階乘後的零

q 給定乙個整數 n,返回 n 結果尾數中零的數量。示例 1 輸入 3 輸出 0 解釋 3 6,尾數中沒有零。示例 2 輸入 5 輸出 1 解釋 5 120,尾數中有 1 個零.說明 你演算法的時間複雜度應為 o log n a 如果按照全部階乘了再去算0的個數,計算量太大。可以發現,如果想多乙個0...