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 <= 10^9
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/preimage-size-of-factorial-zeroes-function
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这个题简单的一匹。。
主要就是要想清楚如何统计的末尾0个数
因为:
而末尾的0显然由2*5得到,而一个阶乘运算中,2要比5多得多,所以只需要统计这个n的阶乘能提供多少个5就可以了
最后注意,像25是能提供两个5的,因为25=5*5,这也是为什么题目中会有0解的存在
而对于非0解,那答案就是5,因为至少要5个数之后才会在遇到一个带因子5的数,末尾0个数才会改变。
最后,我们先写一个函数计算末尾0个数,然后二分查找一下有没有f(x)刚好是k,如果没有就返0,有就返回5
class Solution
{
private long zeroCount(long n)
{
long zero=0;
while(n>0)
{
zero=zero+n/5;
n=n/5;
}
return zero;
}
public int preimageSizeFZF(int k)
{
long left=0,right=(long)5*k,mid;
while(left<=right)
{
mid=(left+right)/2;
long c=this.zeroCount(mid);
if(c>k)
right=mid-1;
else if(c<k)
left=mid+1;
else
return 5;
}
return 0;
}
}