阶乘N!的结果中,有多少个0呢?可以分解N!,观察结果如下:
N! = 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * …… * N
可以发现,我们可以将所有的非素数因子分解为素数因子,那么就可以得到如下的形式:
N! = 2^x * 3^y * 5^z * 7^w ……
可以肯定,2的次数x一定会大于5的次数z。因为从统计上来看,2每间隔一个数至少出现一次,而5需要间隔4个数才会出现一次。同时,产生0的必要条件是出现2*5。那么在2的数量多于5的情况下,5的个数就决定了阶乘结果中0的个数。所以,可以得出,最后的0的个数就是z。
示例程序如下:
1 #include <iostream> 2 using namespace std; 3 4 5 int CalcZeroNum(int n) { 6 int num=0; 7 8 for(int i=5;i<=n;i++) { 9 int k = i; 10 while (k%5==0) { 11 num++; 12 k = k/5; 13 } 14 } 15 return num; 16 } 17 18 int CalcZeroNumImprove(int n) { 19 int num = 0; 20 while(n/5) { 21 n = n/5; 22 num+=n; 23 } 24 return num; 25 } 26 27 int main(void) 28 { 29 int n; 30 cout<<"input your number: "; 31 cin>>n; 32 cout<<endl; 33 cout<<"method 1 : "<<CalcZeroNum(n)<<endl; 34 cout<<"method 2 : "<<CalcZeroNumImprove(n)<<endl; 35 return 0; 36 }
几个测试结果:
1 f(5!) = 1 2 f(10!) = 2 3 f(20!) = 4 4 f(100!) = 24 5 f(1000!) = 249