LintCode 尾部的零

本文介绍了一种计算n阶乘尾部零个数的高效算法,通过分析得出只需判断n除以5及其幂次直到n大于5的m次方即可。提供了两种实现方式,强调了使用long long类型变量的重要性。

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

样例

样例  1:
	输入: 11
	输出: 2
	
	样例解释: 
	11! = 39916800, 结尾的0有2个。

样例 2:
	输入:  5
	输出: 1
	
	样例解释: 
	5! = 120, 结尾的0有1个。

这个题很多人都分析出了只要判断n/5以及n/5^2, 一直到n/5^m, 把他们累加起来就可以了。其中m要求n>5^m.

我的第一种答案也是这么做的,

long long trailingZeros(long long n) {
        // write your code here, try to do it without arithmetic operators.
        //m与n比较,a是m刚好大于n时的数字,5的多少次方
        long long m=5,a=1;
        while(m<n){
            m=m*5;
            a++;
        }
        //count与a比较,num是最结果,h记录中间过程。
        long long count=1;
        long long num=0;
        long long h=1;
        while(count<a){
            for(int i=0; i<count; i++){
                h = h*5;
            }
            num = num+n/h;
            count++;
            h=1;
        }
        return num;
    }

后来我发现这种解法写的复杂了,应该有更简单的解法,于是写出来下一种解法:

long long trailingZeros(long long n) {
        // write your code here, try to do it without arithmetic operators.
        long long num = 0;
        while(n>0){
            num = num + n/5;
            n = n/5;
        }
        return num;
    }

在这里有一个非常重要的事,那就是变量的定义类型,由于测试数据中会有非常大的数字,使用int类型无法满足要求,因此要使用long long类型,这也是之前一直困扰我的地方。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值