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 ;
}
posted @ 2022-08-28 00:32  失控D大白兔  阅读(16)  评论(0编辑  收藏  举报