有时候在ACM竞赛中会遇到这种问题,求  N! 或 N! 末尾有效零个数。

在前面的文章中说过大数问题,求N!(参见 “大数运算续”),本文讨论N!末尾零个数问题。

当然只是为了追求正确的效果,采用模拟运算也是可以的,只不过这极大地浪费时间和计算机有限的内存空间。

这个问题的思考源泉,在大一时遇到过这个问题,我用暴力解决,结果是对了,就是采用大数运算,但是这个效率是可想而知的,随着N的增大,大数间的乘法运算越来越多,所以这种方法是不可取的。

N!末尾零与5的个数有关,在1*2*3……*(N-1)*N中,偶数出现的次数肯定远远大于5(5的倍数)出现的次数,那么归根结底,只要求出5的个数,顺理成章,结果也就有了。

int ans = 0;

for(int i=5;i<=N;i *=5)

     ans += N/i;

有人肯定会问,为什么要求5的不同幂的个数。

对于这个问题,仔细想一下,当i=5时,因子中是5的倍数全部被找出来,

当 i=25时,25可以拆分成 5*5,同理,高n次幂,当计算5时产生一次,实际上仍有n-1个5待找出来。这也就是为什么要求出pow(5,n)个数的原因。

PS:小弟表达能力不佳,不知童鞋们能否看明白,看不明白的话,静下心来仔细想想就OK了。。

Author:Jeick

college of Computer Science,Sichuan University.

link:http://acm.hdu.edu.cn/showproblem.php?pid=1124