问题描述:
1. 给定一个整数N,那么N的阶乘N!末尾有几个0?
2. 求N!的二进制表示中最低位1的位置。
问题1思路和问题2思路一样,一个是求含有5的个数,一个是求含有2的个数。
问题1思路:
书中写到:
一个数 N! = 2x x 3y x 5z…每对2和5相乘都可以得到一个10,于是可以转换为求min(x, z)。显然2出现的次数要比5高,所以只要求有多少个5即可。
求5的个数可以有两种方法:
1. 把N!从1到N的每个数遍历一遍,算出每个数有多少个5组成。
代码如下:
ret = 0;
for(i = 1; i < N ; i++)
{
j = i;
while(j % 5 == 0)
{
ret++;
j /= 5;
}
}
2. 用N 分别除以5, 5的平方, 5的三次方知道除得0;
ret = 0;
while(N)
{
ret += N / 5;
N /= 5;
}
上解法2的证明可用一个例子来说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 23 24 25 26 27
求16! 中5的个数。
首先先求5的一次方的个数。可以得出有 5 10 15 20 25 五个数
再求5的二次方的个数。可以得出有 25一个数。原因在于25 可以分解为5x5。如果仅仅经过第一步,那只得到分解后的一个5,而没有得到第二个5。经第二步才能得到第二个5.
再顺序求下去,知道除以5的x次方商为0时止。