出現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另種程序的思路是一致的,其中一個,是數據不斷增大,當數據很大的時候,會造成耗時很長;另一個是數據不斷減小,沒有出現類似的問題。