问题描述:
给定一个数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3628800 如果N=10000呢,怎么计算?
分析与解法:
刚看到这个题目,也许你想计算出N!的值,那样的话,时间会很长,结果也会溢出。
首先考虑,如果N!=K*10^M,且K不能被10整除,那么N!末尾有M个0,再考虑对N!进行质因数分解N!=(2^x *3^y *5^z..........)由于10=2*5,所以M与x和z有关,每一对2和5相乘都会得到一个10,于是M=min(x,z).不难看出x大于等于z,因为能被2整除的数比5整除的数多多了,所以把问题简化成M=z;
#include<iostream>
using namespace std;
int main()
{
int ret=0,i,N=100,j;
for(i=1;i<=100;i++)
{
j=i;
while(j%5==0)
{
ret++;
j/=5;
}
}
cout<<"100!末尾有"<<ret<<"个0"<<endl;
return 0;
}