出現0的情況是,出現5和2的倍數。
[n/k]代表1~n中能被k整除的個數,而能被2整除的個數多余能被5整除的個數,故只要知道能被5整除的個數即可。那麼怎樣計算n!的質因子中所有5的個數呢?一個簡單的方法是計算floor(n/5)。例如,7!有一個5,10!有兩個5。除此之外,還有一件事情要考慮。諸如25,125之類的數字有不止一個5。例如,如果我們考慮28!,我們得到一個額外的5,並且0的總數變成了6。處理這個問題也很簡單,首先對n÷5,移除所有的單個5,然後÷25,移除額外的5,以此類推。
n!後綴0的個數 = n!質因子中5的個數
= floor(n/5) + floor(n/25) + floor(n/125) + ....
class Solution {
/*
因此只要計數5的個數就可以了。那麼怎樣計算n!的質因子中所有5的個數呢?
一個簡單的方法是計算floor(n/5)。例如,7!有一個5,10!有兩個5。
除此之外,還有一件事情要考慮。諸如25,125之類的數字有不止一個5。
例如,如果我們考慮28!,我們得到一個額外的5,並且0的總數變成了6。
處理這個問題也很簡單,首先對n÷5,移除所有的單個5,然後÷25,移除額外的5,以此類推。
下面是歸納出的計算後綴0的公式。
n!後綴0的個數 = n!質因子中5的個數
= floor(n/5) + floor(n/25) + floor(n/125) + ....
*/
public:
int trailingZeroes(int n) {
int count=0;
int i=5;
while(i<=n)
{
count+=n/i;
i*=5;
}
return count;
}
};//Time Limit Exceeded 比如輸入2147483647
而另外一種:
class Solution {
public:
int trailingZeroes(int n) {
int ret = 0;
while(n)
{
ret += n/5;
n /= 5;
}
return ret;
}
};//OK
另種程序的思路是一致的,其中一個,是數據不斷增大,當數據很大的時候,會造成耗時很長;另一個是數據不斷減小,沒有出現類似的問題。