算法-阶乘函数后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 的条件。

题解

题解需要的相关结论

1、要想产生0,就需要有2和5,2*5就会得到0,像10,100等都可以拆成多个2和5相乘

2、阶乘中2的数量远远多于5的数量,以10以内的数字为例,2,4,6,8都有2,5却只有一个

3、想要有K个0,可以在5*K的范围内查找即可,因为5*k表示的数的阶乘,5的数量>=k

4、如果一个数n包含的5的数量正好是K个,那么n+1,n+2,n+3,n+4,这4个数包含的5的数量也是K个。加上n这个数就是5个数,小于n的数,不够k个5,大于等于n+5的数,5的数量大于k个

题解思路:二分查找

java 复制代码
class Solution {
    public int preimageSizeFZF(int k) {
        long start = 0L, end = 5L * k, mid;
        while(end >= start) {
            mid = start + (end - start) / 2;
            long n = 5L, nums = 0L;
            //循环计算包含5的个数,25包含两个5,125包含3个5,一此类推
            while (n <= mid) {
                nums += mid / n;
                n *= 5;
            }
            if (nums == k) return 5;
            if (nums < k) start = mid + 1;
            else end = mid - 1;
        }
        return 0;
    }
}
相关推荐
晴天的雨.9923 小时前
【C++算法】和为s的两个数
开发语言·数据结构·c++·算法
aramae9 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
荆棘鸟智能10 小时前
城市感知设备怎么统一接入?从多协议网关到设备模型的中间件架构设计
人工智能·算法·边缘计算
INGNIGHT14 小时前
270 · 电话号码的字母组合II(Trie)
linux·算法
2401_8390805414 小时前
C++常见八股
数据结构·c++·算法
青山是哪个青山15 小时前
LeetCode 188:买卖股票的最佳时机 IV
算法
mikuyyds15 小时前
geo-toolbox 插件算法解析:RUSLE 与 MUSLE 的工程化落地
算法·rust·gis
a1879272183115 小时前
【算法】树(二):队列与祖先——BFS 骨架三配件、短路透传与合流
算法·leetcode·二叉树··bfs·算法讲解·树遍历
syagain_zsx15 小时前
算法基础篇 · 03 枚举(C++ 题解)
c++·算法·二进制·枚举
weixin_3077791316 小时前
C++代码实现MATLAB中的ode23tb函数功能
开发语言·c++·算法·matlab