leetcode-172-Factorial Trailing Zeroes
題目描述:
Given an integer n, return the number of trailing zeroes in n!.
Note: Your solution should be in logarithmic time complexity.
要完成的函數:
int trailingZeroes(int n)
說明:
1、這道題目要求輸出n!中從後面數起有多少個連續的0。時間復雜度要求是O(log)。
2、首先我們肯定不能直接計算,100!已經超過c++能處理的乘數範圍了。所以我們只能仔細分析,看能不能找到一些數學規律,來統計有多少個連續的0。而且題目這種問法很明顯就是要運用數學方法的。
3、經過計算,我們得到如下數據:
1! 1 0個0
2! 2 0個0
3! 6 0個0
4! 24 0個0
5! 120 1個0
6! 720 1個0
7! 5040 1個0
8! 40320 1個0
9! 362880 1個0
10! 3628800 2個0
11! 39916800 2個0
我們可以看到5!以前都是沒有0的,直到24*5=120才出現了第一個0,後續再乘以6,乘以7,乘以8,乘以9都沒有出現第二個0,直到乘以10再出現了第二個0。
乘以10會出現第二個0,歸根結底是因為乘以了5。因為在n!中2都是充足的,只要出現了5就可以再添上一個0。
除了10=2*5之外,沒有其他任何情況會生成10。
那這樣子我們也可以統計出:
12! 2個0
13! 2個0
14! 2個0
15! 3個0 因為又乘以15=3*5,又添上一個0
似乎5的倍數都會添上一個0呢!
那20! 4個0 因為又乘以20=4*5,又添上一個0
25! 6個0 因為又乘以25=5*5,出現了2個5,所以又添上兩個0
30! 7個0 因為又乘以30=6*5,又添上一個0
35! 8個0 因為又乘以35=7*5,又添上一個0
40! 9個0 因為又乘以40=8*5,又添上一個0
45! 10個0 因為又乘以45=9*5,又添上一個0
50! 12個0 因為又乘以50=2*5*5,又添上兩個0
到這裏,我們似乎可以總結出規律了,25!之所以會有6個0,是因為25/5=5,前面有5個5的間隔了(5、10、15、20、25),然後25=1*5*5,又出現一個5,所以加起來會有6個0.
50!之所以會有12個0,是因為50/5=10,前面有10個5的間隔了,然後50=2*5*5,有2個5,所以要再加上2。
75=3*5*5,所以會有18個0,75/5=15,再加上3個0,,構成18個0。
100=4*5*5,所以會有24個0,100/5=20,再加上4個0,構成24個0。
125=1*5*5*5,所以會有31個0,125/5=25,再加上5個0,再加上1個0,構成31個0。
所以對於每一個數,其實我們可以看一下,它除以5等於多少,result初始為0再加上這個數,然後這個數再除以5,看看等於多少,result再加上,然後這個數再除以5,result再加上……直到這個數最後為0。
代碼如下。
代碼:
int trailingZeroes(int n)
{
int result=0;
while(n)
{
n/=5;
result+=n;
}
return result;
}
非常簡潔,時間復雜度也滿足要求,beats 100% of cpp submissions。
leetcode-172-Factorial Trailing Zeroes