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));
}
}