Given an integer n, return the number of trailing zeroes in n!.
//題目描述:給定一個整數n,返回n!(n的階乘)數字中的後綴0的個數。
//方法一:先求得n的階乘,然後計算末尾0的個數,這種方法當n比較大是,n!會溢出
class Solution {
public:
int trailingZeroes(int n) {
if (n == 0) return 0;
int m = 0;
int cnt = 0;
int k = factorial(n);
while (k){
m = k % 10;
k = k / 10;
if (m == 0)
cnt++;
else
break;
}
return cnt;
}
//計算n的階乘
int factorial(int n1){
if (n1 == 0) return 1;
else{
return n1*factorial(n1 - 1);
}
}
};
//方法二:考慮n!的質數因子。後綴0總是由質因子2和質因子5相乘得來的,如果我們可以計數2和5的個數,問題就解決了。
//考慮例子:n = 5時,5!的質因子中(2 * 2 * 2 * 3 * 5)包含一個5和三個2。因而後綴0的個數是1。
//n = 11時,11!的質因子中((2 ^ 8) * (3 ^ 4) * (5 ^ 2) * 7)包含兩個5和八個2。於是後綴0的個數就是2。
//我們很容易觀察到質因子中2的個數總是大於等於5的個數,因此只要計數5的個數即可。
//那麼怎樣計算n!的質因子中所有5的個數呢?一個簡單的方法是計算floor(n / 5)。例如,7!有一個5,10!有兩個5。
//除此之外,還有一件事情要考慮。諸如25,125之類的數字有不止一個5。
//例如n=25, n!=25*24*23*...*15...*10...*5...*1=(5*5)*24*23*...*(5*3)*...(5*2)*...(5*1)*...*1,其中25可看成5*5,多了一個5,應該加上
//處理這個問題也很簡單,首先對n÷5,移除所有的單個5,然後÷25,移除額外的5,以此類推。下面是歸納出的計算後綴0的公式。
//n!後綴0的個數 = n!質因子中5的個數= floor(n / 5) + floor(n / 25) + floor(n / 125) + ....
class Solution2{
public:
int trailingZeroes(int n){
int res = 0;
while (n){
res = res + n / 5;
n = n / 5;
}
return res;
}
};
