1. 程式人生 > >計算階乘末尾0的個數

計算階乘末尾0的個數


這個題目是程式設計之美上出現的,今年在幾個公司筆試的時候都出現了這個題目,之前一直以為 直接用 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;
}