求N!結果尾數有幾個0

問題:求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高一些。


參考書籍:《編程之美》

相關文章
相關標籤/搜索