LeetCode 172 Factorial Trailing Zeroes

本文介绍了一种高效计算n的阶乘末尾0的个数的方法,通过质因数分解原理,聚焦于5的倍数及其幂次在n!中的贡献。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意是给一个数n,让你求出n的阶乘末尾0的个数,利用质因数分解可以将n的的阶乘看成多个质因数的幂相称的结果,其中,只有2和5相乘才会出现10,增加末尾零,因为2的个数远大于5,所以求末尾0的个数问题就转化为求n!中5的个数。

在n!中,只有5,10,15,20,25,30,35,40,45,50.。。。。这些5的倍数含有5,此为第一层。

在第一层中,25,50,75,,,,这些是5的多次幂,在第一层的基础上多包含了5

在第二层中,125,250,,,,,这些又在第二成的基础上多包含了5

.。。。。

依次递归求下去,可得求解函数。

题目链接

代码如下

class Solution {
public:
    int trailingZeroes(int n) {
        int sum = 0;
        for (long long i = 5; i <= n; i *= 5) {
            sum += n/i;
        }
        return sum;
    }
};

第一次写的代码,,,用的是正着乘上去的思路,但是总是有点误差,而且数还挺大,原来卡了个边界,当n正好为int边界,临近n之下的i的极限乘上5之后会超出int范围,导致误差,把i的类型改为long long 便可以过了。

之后将写法改成边除边加的思路,可以规避这个边界问题。

class Solution {
public:
    int trailingZeroes(int n) {
        int ans = 0;
        while(n){
            n /= 5;
            ans += n;
        }
        return ans;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值