LeetCode-793-阶乘函数后的K个零

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,找出返回能满足 f(x) = k 的非负整数 x 的数量。

示例 1:

输入:k = 0
输出:5
解释:0!, 1!, 2!, 3!, 和 4! 均符合 k = 0 的条件。

示例 2:

输入:k = 5
输出:0
解释:没有匹配到这样的 x!,符合 k = 5 的条件。

示例 3:

输入: k = 3
输出: 5

提示:

  • 0 <= k <= 109
class Solution {
    public int preimageSizeFZF(int k) {
        return (int) (f(k) - f(k - 1));
    }

    /**
     * 计算小于等于 k 个 0 的数有多少个
     * @param k k
     * @return 小于等于 k 个 0 的数量
     */
    private long f(long k) {
        // right 预估一个大概值, 或者直接选取比 10^9 大的值
        long left = -1, right = 5 * (k + 1);
        while (left < right) {
            long mid = (right - left + 1) / 2 + left;
            if (trailingZeroes(mid) <= k) {
                left = mid;
            } else {
                right = mid - 1;
            }
        }
        return left;
    }

    /**
     * 计算 n 的阶乘末尾有几个0
     * @param n n
     * @return n 的阶乘末尾有几个0
     */
    private long trailingZeroes(long n) {
        int res = 0;
        while (n != 0) {
            n = n / 5;
            res += n;
        }
        return res;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.preimageSizeFZF(5));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值