这里有一个问题:给定一个整数N,那么N的阶乘N!的末尾有几个零?例如:N=5,N!=120,N!的末尾有1个零。
用正常思路把N!求出来再看末尾有几个零是不现实的,N如果取得稍微大点很容易就会超过数据的范围。如果换个角度,从哪些数相乘能得到10这个方向思考就简单多了。
25=10,101=10,而101的10可以拆成25,所以我们只要考率N里有多少个5和2,2的数量又是远远多于5的,所以只需要考虑N中有多少个5就好了。
5!=120,N中有一个5,末尾1个0;10!=3628800,N中有两个5,末尾2个0;15!N中3个5,N中有3个0;似乎只需N/5就得到末尾0的个数,但事实不然。
25!中就有6个0,而25/5=5,那多出来的一个5是谁提供的呢?425=100,末尾是两个零,前面多出的一个零就是25提供的,425可以分解为252*5,分解出两个5。所以,再考虑完N/5后我们还要再考虑N中有没有5的m次方的数,像25,125,625这样的数。只需要判断下N/5的结果对5取余后是否为0,若为0说明N中有5的m次方的数,就需要继续除5。
代码很简单,如下所示:
int num;
num=N/5;
while(num%5==0)
{
num=num+num/5;
}
还有一种升级版:
int num;
while(N)
{
num+=N/5;
N/=5;
}
这里是十进制的找0方法,换其余的进制算法流程类似,例如8进制里就找2,3个2就是1个0。