問題:求N!結果尾數有幾個0算法
首先可能想到的解法是求出結果,而後分解,統計0的個數。但若是是100!?怎麼辦?根本存不下這麼大的整數。編程
咱們知道10能夠且只能分解爲2*5,只有當因子中存在成對的2和5的時候,纔會有尾數爲0的狀況。優化
例如:7! --> 1*2*3*4*5*6*7 -->1*3*4*6*7*2*5spa
只出現了一對2和5,因此結果必然只有一個0。因此咱們只需統計有多少對2和5,就能夠知道有多少個0。code
進一步分析,咱們須要的是有多少對2和5,即min(2的個數,5的個數),可是5的個數明顯是小於2的個數的,由於任何一個偶數均可以分解出一個因子2,可是隻有5的倍數才能分解出一個5 。咱們只需統計因子5出現的個數便可。class
如今關鍵問題就是求解因子5的個數,那就簡單了效率
算法1書籍
int calculate(int n) { int count = 0; for(int num = 1; num<=n; num++) { int x=num; while(x%5==0) { count++; x/=5; } } return count; }
比較簡單,就不作解釋了。統計
進一步優化,其實因子5的個數count=【N/5】+【N/25】+【N/125】+...知道爲0結束while
舉個例子:76! count= [76/5]+[76/25]
76/5,即15,表明76的階乘中有15個數能夠至少分解出1個5,那麼還要考慮25這樣的狀況,由於他能夠分解成5*5,因此76/25,即3,表明76的階乘中有3個數能夠至少分解出2個5,即5*5*x,例如25,50,75,76/125顯然爲0,表明沒有不存在能分解成3個或3個以上5的數。
算法2
int calculate(int n) { int count = 0; while(n) { count+=n/5; //n每次除以5,即至關於被除數每次乘以5 n/=5; } return count; }
改算法效率要比算法1高一些。
參考書籍:《編程之美》