JavaInterview JavaInterview
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)

『Java面试+Java学习』
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)
  • 指南
  • 简历

  • Java

  • 面试

  • 算法

  • algorithm
  • leetcode
JavaInterview.cn
2022-10-15
目录

阶乘函数后 K 个零Java

文章发布较早,内容可能过时,阅读注意甄别。

# 题目

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

# 思路

用二分查找来解这个题,但感觉题解有点搞复杂了,因为答案只可能是5或0,

所以只要找到满足f(x)=k的x就是5,没找到就是0。

# 解法


class Solution {

    //f(x)=x!末尾0的数量=因子5的总数(2足够多)
    //令f(x)=k的x的个数只能是5或0(x每增大5,因数5就会增多,但可能不只增多1个)
    //k = x/5 + x/5^2 + x/5^3 + ......
    //x/5 <= k
    //x <= 5k
    //在[0, 5*k]内二分求解x,如果能找到,就是5,否则就是0.
        public int preimageSizeFZF(int k) {
        long left = 0L;
        long right = 5L * k;
        while (left <= right) {
            long mid = left + (right - left) / 2;
            if (getFX(mid) > k) {
                right = mid - 1;
            } else if (getFX(mid) < k){
                left = mid + 1;
            } else {
                return 5;
            }
        }
        return 0;
    }
    
    public long getFX(long n) {
        long ans = 0;
        while (n != 0) {
            n /= 5;
            ans += n;
        }
        return ans;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

# 总结

  • 分析出几种情况,然后分别对各个情况实现
微信 支付宝
最近更新
01
1686. 石子游戏VI Java
08-18
02
1688. 比赛中的配对次数 Java
08-18
03
1687. 从仓库到码头运输箱子 Java
08-18
更多文章>
Theme by Vdoing | Copyright © 2019-2025 JavaInterview.cn
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式