(1)n!末尾有多少个0?
这道题可以参考《编程之美》2.2节“不要被阶乘吓倒”。
用数学语言描述解法对我来说,太艰难了。我这里只是举例子(n=100)加以说明。
方法一:在1~100中,5*2=10, 10*1=10, 15*2=30, 20*1=20, 25*4=100,...100*1=100
这里注意到,只要是能够被5整除的数,都会在末尾产生0,其中25和100(其实还有50,75)会在末尾产生2个0。因此,能够被25(5*5)整除的数会在末尾产生2个0,同理,能够被125(5*5*5)整除的数会在末尾产生3个0,能够被5^x整除的数会在末尾产生x个0.
因此方法一的算法如下:
在1~100中,对于每个能够被5整除的数(初始值为5,步进为5的所有数都能够被5整除,至于其他数,因为不能被5整除,所以能在末尾产生0的个数为0,也就不需要考虑),考察能够被5整除多少次,如75,75/5=15, 15/5=3, 3/5=0, 所以75能够被5整除2次。
将被5整除的次数加起来就是末尾0的个数。
方法二:100/5=20,也就是1~100中能被5整除的个数有20个,20/5=4,也就是1~100中能被25(5^2