题目1:给定一个数n,问n的阶乘的十进制表示中末尾有几个0?
题目2:给定一个数n,问n的阶乘的二进制表示中末尾有几个0?
分析:题目1:此问题等价于n的阶乘包含多少个因子10.对10进行分解的2×5,则此题等价于求解n的阶乘中包含多少个因子2和多少个因子5,并取两者中中的较小值。简单分析可得n的阶乘中所包含的因子5的个数肯定比所包含的因子2的个数少,所以本题等价于求解n的阶乘中包含因子5的个数。即n的阶乘中所包含因子5的个数就是n的阶乘的十进制表示中末尾0的个数。
解决方法:可知,能被5整除但不能被25整除的数中包含一个因子5,能被25整除而不能被125整除的数中包含2个因子5,......依此往上推。所以n的阶乘中包含因子5的个数可以这样计算:小于n且能被5整除的数的个数+小于n且能被25整除的数的个数+小于n且能被125整除的个数+......。注:能被25整除的也能被5整除,所以只是简单的加上能被25整除的数的个数而没有乘以2(25中含有两个因子5),因为前面计算能被5整除的数时已经算过一次。其他同理。
下面是题目的一个C语言实现:
#include<stdio.h>
int calculat_zero_number_at_rear(int n)
{
}
int main()
{
}
题目2也可以用以上相同的方法求解,只是需要把程序中的5改写成2即可。题目2还有没有效率更高的解放呢?假如你知道这个特性,你就知道有更高效的方法。这个特性是:n的阶乘中所含因子2的个数等腰n减去n的二进制表示中1的个数。这样只要求得n的二进制表示中1的个数即可。n的二进制表示中所含1的个数可以参考:http://blog.sina.com.cn/s/blog_8b745a5f0101698t.html