問題
Given an integer n, return the number of trailing zeroes in n!.
Note: Your solution should be in logarithmic time complexity.
例子
10
24
分析
n! = 1*2*3*...*n. 要讓n!的末尾有0,1...n中必須有若干數(shù)字有2和5的因子,因為2*5=10。由于因子2的數(shù)量肯定要遠遠多于因子5的數(shù)量,所有我們只考慮因子5就行了。進一步來說,n!末尾0的數(shù)量就等于1...n這n個數(shù)中所含有的因子5的數(shù)量。
舉個例子,27! = 1*2*3...*25*6*27,包含因子5的個數(shù)=1(5=1X5) + 1(10=2X5) + 1(15=3X5) + 1(20=4X5) + 2(25=5X5)=6,所以27! 的末尾有6個0.
那么如果求1...n這n個數(shù)所含因子5的個數(shù)呢?我們首先把n除5,得到的是1...n中只有一個因子5的數(shù)的個數(shù);把n除25,得到的是1...n中只有兩個個因子5的數(shù)的個數(shù);把n除125,得到的是1...n中只有三個個因子5的數(shù)的個數(shù)......把n除5m,得到的是1...n中只有m個個因子5的數(shù)的個數(shù),直到5m>n。然后把所有這些個數(shù)加起來,就是1...n這n個數(shù)所含因子5的個數(shù)。
要點
要能看出來n!末尾0的數(shù)量 = 1...n這n個數(shù)中所含有的因子5的數(shù)量
時間復雜度
O(logn)
空間復雜度
O(1)
代碼
迭代版
class Solution {
public:
int trailingZeroes(int n) {
int count = 0;
// 注意i *= 5可能溢出,所以i定義為long long
for (long long i = 5; i <= n; i *= 5)
count += n / i;
return count;
}
};
遞歸版
class Solution {
public:
int trailingZeroes(int n) {
return n == 0 ? 0 : n / 5 + trailingZeroes(n / 5);
}
};