Leetcode-172. 阶乘后的零

这篇博客讨论了如何计算一个整数阶乘结果中尾随零的数量。关键在于理解尾部零是由2和5的乘积产生,而2的数量通常多于5。因此,主要关注能拆出多少个5。通过迭代和除法,可以计算出阶乘中有多少个5的倍数,从而确定尾随零的个数。博客还提供了一行代码解决方案来快速求解这个问题。
摘要由CSDN通过智能技术生成

链接

172. 阶乘后的零

题目

给定一个整数 n ,返回 n! 结果中尾随零的数量。

提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1

示例

示例 1:
输入:n = 3
输出:0
解释:3! = 6 ,不含尾随 0

示例 2:
输入:n = 5
输出:1
解释:5! = 120 ,有一个尾随 0

示例 3:
输入:n = 0
输出:0

说明

  • 0 <= n <= 10e4

思路

  • 1.末尾有0,这个0必然是两个数相乘等于10得到的,而10的因数除了1和本身,就只有2和5,如6!=6*5*4*3*2*1=720, 720就是由72*10=6*4*3*1 * 5*2得到了,因此,末尾有多少个0,就看阶乘的所有数字里面能拆多少对2*5出来。再比如10!=10*9*8*7*6*5*4*3*2*1=3628800,这里有2个0,是因为,有10的2*5里的一个5,以及本身5的一个5,以及众多的2。
  • 2.末尾有多少个0,取决于有多少对2和5,而从上面的例子我们可以看出,2的数量远远多于5,像2,4,6,8这些数里,都包含2,因此,最终有多少个0,取决于整个阶乘可以拆出多少个*5,如15!=15*....10*...5*....1,末尾的0的数量=1+1+1=3。
  • 3.因此,本题转换成,从n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1里,可以拆除多少个5,这里我们只要考虑5的倍数的数,即5,10,15,20,25,30....,而5,10,15,20都只包含一个5,25=5*5包含2个5,125=5*5*5包含3个五,因此求有多少个5的代码可写成:
int count=0;
while(n>=5)
{
  count=count+n/5; //从1到n,每隔5个数有一个*5,如5,10,15
  n=n/5; //对于625,125,25这些数,包含不止1个5,需要再次累加
}

C++ Code

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

此外,还可以一行解决。

class Solution {
public:
    int trailingZeroes(int n) {
        return n / 5 + n / 25 + n / 125 + n / 625 + n / 3125;
    }
};
class Solution {
public:
    int trailingZeroes(int n) {
        return n < 5 ? 0 : n / 5 + trailingZeroes(n/5);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值