100阶乘末尾有多少个零
100! = 1 * 2 * 3 * ... * 99 * 100
如果结尾要有0,必然是有两个数字相乘进位了,而10 = 2 * 5,所以一个数字末尾有多少个0,取决于它分解因子后,有多少个2和有多少个5,假设2的个数为m,5的个数为n,那么最终的结果为min(m,n),而根据实际情况,当数字大于10且末尾有0的时候,显然2的个数必然大于等于5的个数,所以最终的结果取决于因子5的个数,也就是说,一个数字末尾0的个数取决于其分解因子之后5的个数,前提是它必然有0,用f(n)来表示数n末尾0的个数,即包含的因子5的个数,则100!末尾0的个数就可以表示为f(100!) = f(100) + f(99) + f(98) + ... + f(2) + f(1),其中
100末尾有2个0,即有2个因子5,f(100) = 2,
99末尾没有0,也没有因子5,即f(98) = 0
...
95末尾没有0,有因子5一个,即f(95) = 1
...
5末尾没有0,有因子5一个,即f(5) = 1
...
F(100!) = f(100) + f(99) + f(98) + ... + f(2) + f(1) = 2 + 20 + 1 + 1 = 24
此处进一步讨论任意一个数n,其含有的因子5的个数,
int f(int n) { int ret = 0; while(n) { if(0 == n % 5) { n /= 5; ++ret; } else { break; } } return ret; }
现在进一步问N!末尾有几个0
int g(int n) { if(n < 5) { return 0; } int sum = 0; for(int i = 1; i <= n; ++i) { sum += f(i); } return sum; }