Leetcode 793. 阶乘函数后K个零 C++

Leetcode 793. 阶乘函数后K个零

题目

f(x) 是 x! 末尾是0的数量。(回想一下 x! = 1 * 2 * 3 * … * x,且0! = 1)

例如, f(3) = 0 ,因为3! = 6的末尾没有0;而 f(11) = 2 ,因为11!= 39916800末端有2个0。给定 K,找出多少个非负整数x ,有 f(x) = K 的性质。

测试样例

示例 1:
输入:K = 0
输出:5
解释: 0!, 1!, 2!, 3!, and 4! 均符合 K = 0 的条件。

示例 2:
输入:K = 5
输出:0
解释:没有匹配到这样的 x!,符合K = 5 的条件。
注意:

  • K是范围在 [0, 10^9] 的整数。

题解

二分查找
我们先思考一下结果有几种可能,首先我们可以确定的是,阶乘中出现0,便是因为数的因子中存在5,出现一次5便会多1个零。显然,因子5是每隔5个数才会多出现的,所以,结果只能有两种可能,一个为0,一个为5。
我们再考虑一下如果使用二分查找,我们在刚才的分析中可以知道,只有遇到因子5才会多出现0,也就是说数越大那么其阶乘后的0的数目越多,显然符合二分查找的一个特点。我们就找当前数的阶乘有多少个0,如果多于目标值K,我们就在下半区间中找;如果少,我们则在上半区间中找;相等,则直接输出5。
对于一个数的阶乘有多少个0,我们就看有多少了因子5即可。
详细过程见代码

代码

	long zeroCnt(long x){		//判断当前数的阶乘有多少了0,也就是因子5的个数
        if(x == 0)  return 0;
        return x/5 + zeroCnt(x/5);
    }
    int preimageSizeFZF(int K) {
        long left=0,right=(long)10*K+1,mid;
        while(left < right){
            mid = (left+right)/2;
            long cnt = zeroCnt(mid);
            if(cnt == K)    return 5;
            else if(cnt < K)    left = mid+1;
            else    right = mid;
        }
        return 0;
    }

来源:力扣(Le etCode)
链接:https://leetcode-cn.com/problems/preimage-size-of-factorial-zeroes-function
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值