LeetCode/阶乘后的零
1. 返回尾零数量
可以转换为求质因子为2和5数量的较小值,实际上就是求质因子为5的数量
class Solution {
public:
int trailingZeroes(int n) {
int ans = 0;
for (int i = 5; i <= n; i += 5) //遍历所有含质因子5的数
for (int x = i; x % 5 == 0; x /= 5) //计算该数有几个为5的质因子
++ans;
return ans;
}
};
//优化写法
class Solution {
public:
int trailingZeroes(int n) {
int ans = 0;
while (n) {
n /= 5;//累求质因子为5的k次方的数
ans += n;
}
return ans;
}
};
2. 求满足阶乘尾零为k数的个数
int preimageSizeFZF(int k) {
return help(k + 1) - help(k);//使得尾零恰为k+1的整数减去使得尾零恰为k的整数
}
long long help(int k) {//二分查找
long long r = 5LL * k;//二分上界
long long l = 0;//二分下界
while (l < r) {
long long mid = (l + r) / 2;
if (zeta(mid) < k) //尾零少于目标值
l = mid + 1;//移动左边界
else r = mid;//移动右边界,找第一个满足条件值(也就是满足条件的区间左边界)
}
return r ;
}