2.尾部的零

2.尾部的零

设计一个算法,计算出n阶乘中尾部零的个数

样例

11! = 39916800,因此应该返回 2

分析

两个大数字相乘,都可以拆分成多个质数相乘,而质数相乘结果尾数为0的,只可能是2*5。而在某个范围内5的个数必定比2少,因为每隔2个数就有会出现因子2。
对于一个正整数n来说,怎么计算n!中5因子的个数呢?我们可以把5的倍数都挑出来,即:

n! = (5*K) * (5*(K-1)) * (5*(K-2)) * ... * 5 * A
其中A就是不含5因子的数相乘结果,
n = 5*K + r(0<= r <= 4)
假设f(n!)是计算阶乘n!尾数0的个数,那么就会有如下公式:

  f(n!) 
= f((5*K) * (5*(K-1)) * (5*(K-2)) * ... * 5 * A) 
= f(5^K * K! * A) 
= K + f(K!) ,其中K=n / 5(取整数)。

这里5的个数与0的个数一一对应,因而5^K共有K个5,K!*A里则有f(K!)个5,A不包含因子5,所以可以去掉A,故共有K+f(K!)个5。
最终代码如下

class Solution {
public:
    long long trailingZeros(long long n) {
        return trailingNum_Number(n,0);
    }

    long long trailingNum_Number(long long n,long long number){
        if(n/5==0){
            return number;
        }else{
            return trailingNum_Number(n/5,number+n/5);
        }
    }

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值