1. 程式人生 > >求整數N階乘N!末尾有多少個0呢?

求整數N階乘N!末尾有多少個0呢?

一、採用常規的做法,求出N的階乘,然後計算出該結果末尾的0的個數;
這種方法有兩個缺陷:
(1)無論將結果定義為long還是double,結果值都會溢位;
(2)效率低下;

方法一:
那麼我們分析,N!中能產生末尾是0的質數組合是2*5;所以N!的結果末尾0的個數;取決於2的個數X和5的個數Y的最小值;因所以M=min(X,Y);又因為能被2整除的數出現的頻率比能被5整除的數高得多,且出現一個5的時,最少會同時出現一個2,所以M = Y。即得出Y的值就可以得到N!末尾0的個數。

方法1
#include<iostream>
using namespace std;
int fun(int
n) { int count=0; while (n>=5) { if (n%5==0) { int ret=n; while (ret%5==0) { count++; ret=ret/5; } } n--; } return count; }

方法二:方法一的優化
那 麼還有沒有更簡單點的方法得到Y呢?
舉個例子 25的階乘中,總共有6個五,其中5,10,15,20,各貢獻一個,25貢獻兩個,也可以說成,5,10,15,20,25各貢獻一個,25又額外貢獻 一個,即5的倍數各貢獻一個5,25的倍數各貢獻一個5,

即Y=[25/5] + [25/25]。同理,125中,5的倍數各貢獻一個5,25的倍數各貢獻一個5,125的倍數也各貢獻一個5,所以Y=[125/5] + [125/25] + [125/125],所以可得公式:

#include<iostream>
using namespace std;
int Fun(int n)
{ 
    int count=0;
    while (n>4)
    {
        count=count+n/5;
        n=n/5;
    }
    return count;
} 
int main()
{
    cout<<Fun(70
)<<endl; return 0; }