100阶乘末尾有多少个零

100! = 1 * 2 * 3 * ... * 99 * 100

如果结尾要有0,必然是有两个数字相乘进位了,而10 = 2 * 5,所以一个数字末尾有多少个0,取决于它分解因子后,有多少个2和有多少个5,假设2的个数为m5的个数为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末尾有20,即有2个因子5f(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;
}

 

posted @ 2016-07-08 15:21  Geeken  阅读(1324)  评论(0编辑  收藏  举报