計算階乘末尾0的個數
阿新 • • 發佈:2019-01-30
這個題目是程式設計之美上出現的,今年在幾個公司筆試的時候都出現了這個題目,之前一直以為 直接用 N / 5 就是結果,昨天被土豆麵試的時候,才發現自己理解錯了,思路是這樣的,0 的個數就是 1,,2,...,n中n個數中能夠分解出5的因子的個數。之前以為 5,10,20,..., n/5 * 5 總共有 n/5個能夠提出5的因子的,但是顯然這裡出現了問題,對於 25 這個數 = 5^2 能提出兩個5的因子,所以應該會產生兩個0。那我們該怎麼解決這個問題呢,我們將5,10,20,....,n/5 * 5 提出一個因子5 ,5*1,5*2,5*3,5*4,5*5,5*(n/5) 即 5(1,,2,3,4,...,n/5) 後面括號中又會產生5,而且是按照前面同樣的方式。 所有能夠產生5的個數應該是:n/5+n/5/5+n/5/.../5,一直到某個數/5=0 。如對於n=2000,末尾0的個數為:
5 2000
5 400
5 80
5 16
3 ... 1
所有0的個數為 = 2000/5+ 400/5 + 80/5 + 16/5 = 400+80+16+3 = 499
好了,其實簡單的程式如下:
int calcZero(int n)
{
int sum = 0;
while(n / 5) sum+= n/5;
return sum;
}