LeetCode 793 阶乘函数后K个零

基本上算是一道数学题,给出一个数字K,问有多少个非负整数的阶乘末尾有K个零。当初只知道答案只可能是0或5,因为末尾有0必定是2和5的乘积,每过五个数末尾0的数量一定会改变,求出阶乘有多少个2*5就不容易了,因为不可能实际求出阶乘。问题可以转变成求出有多少个因子5,因为2一定比5多,后来看了官方的解题思路,才明白怎么求出5的个数,阶乘中像5,10,15......每过5个数必有一个5的因子,像25,50,75。。。。。。每过5²必定含有两个5,因为第一轮我们已经统计过这些数的其中一个因子5,所以我们在第二轮只需统计另一个因子5,一直重复下去直到第n轮X!中的X比5n要小,综上,我们可以这样求出阶乘中因子5的个数为⌊X/5⌋+⌊X/(52)⌋+⌊X/(532)⌋+⌊X/(54)⌋+⌊X/(5^5)⌋+......这个函数是递增的,我们可以用二分来找到是否有数满足这个条件,如果有,那必定是五个数,没有就返回0。注意变量尽量都用long long,否则很可能出现越界错误。

class Solution {
public:
    long long judge(long long x)
    {
        if(x>0)
            return x/5+judge(x/5);
        else
            return 0;
    }
    int preimageSizeFZF(int K) {
        long long l=0,r=0x7ffffffff,mid,now,flag=0;
        while(l<=r)
        {
            mid=l+(r-l)/2;
            now=judge(mid);
            if(now>K)
            {
                r=mid-1;
            }
            else if(now<K)
            {
                l=mid+1;
            }
            else
            {
                flag=1;break;
            }
        }
        if(flag) return 5;
        else return 0;
    }
};

猜你喜欢

转载自www.cnblogs.com/ambition-hhn/p/12818485.html