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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。