N的階乘末尾有多少個0

問題:N的階乘(N!)中的末尾有多少個0?
     例如:N = 5,N! = 120.末尾有1個0.
 
分析:想到這個問題,有人可能第一反應就是現求出N!,然後再根據求出的結果,最後得出N!的末尾有多少個0。但是轉念一想,會不會溢出,等等。

     其實,從"那些數相乘可以得到10"這個角度,問題就變得比較的簡單了。
     首先考慮,如果N的階乘爲K和10的M次方的乘積,那麼N!末尾就有M的0。如果將N的階乘分解後,那麼
     N的階乘可以分解爲: 2的X次方,3的Y次方,4的5次Z方,.....的成績。由於10 = 2 * 5,所以M只能和X和Z有關,每一對2和5相乘就可以得到一個10,於是M = MIN(X,Z),不難看出X大於Z,因爲被2整除的頻率比被5整除的頻率高的多。所以可以把公式簡化爲M=Z.
     
     由上面的分析可以看出,只要計算處Z的值,就可以得到N!末尾0的個數

方法一
    要計算Z,最直接的方法就是求出N的階乘的所有因式(1,2,3,...,N)分解中5的指數。然後求和
    

int fun1(int n)
{
    int num = 0;
    int i,j;
    
    for (= 5;<= n;+= 5)
    {
        j = i;
        while (% 5 == 0)
        {
            num++;
            j /= 5;
        }
    }
    
    return num;
}




方法二:

Z = N/5 + N /(5*5) + N/(5*5*5).....知道N/(5的K次方)等於0

公式中 N/5表示不大於N的數中能被5整除的數貢獻一個5,N/(5*5)表示不大於N的數中能被25整除的數再共享一個5.......




int fun2(int n)
{
    int num = 0;
    
    while(n)
    {
        num += n / 5;
        n = n / 5;
    }
    
    return num;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章