求整數N階乘N!末尾有多少個0呢?
阿新 • • 發佈:2019-02-19
一、採用常規的做法,求出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,
#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;
}