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 的数量。
输入:k = 0
输出:5
解释:0!, 1!, 2!, 3!, 和 4! 均符合 k = 0 的条件。
输入:k = 5
输出:0
解释:没有匹配到这样的 x!,符合 k = 5 的条件。
输入: k = 3
输出: 5
0 <= k <= 109
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/preimage-size-of-factorial-zeroes-function
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这道题利用了二分查找的方,但是有点复杂,偷了个懒没看,记得多去翻翻。
- class Solution {
- public:
- int preimageSizeFZF(int K) {
- if(K == 0) return 5; // 如果不加入 这个case, 那么边界 == 0 输出正确结果完全是巧合
-
- long long left = (long long)K;
- long long right = 5 * (long long)K + 1;
-
- while(left < right){
- long long mid = left + (right - left) / 2;
- int rstK = help(mid);
- if(rstK == K) return 5;
- if(rstK < K) {left = mid + 1;} // 千万不能写成 left++, 否则时间复杂度就上升很多
- else{
- right = mid;
- }
- }
-
- return 0;
- }
- // 用以计算 K! 尾部 0 的个数
- int help(long long k){
- long long ans = 0;
-
- if(k < 5) return ans;
-
- while(k >= 5){
- ans += (k / 5);
- k /= 5;
- }
- return ans;
- }
- };