LeetCode172. 阶乘后的零

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

示例 1:

输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。
示例 2:

输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.

分析:
1.先求阶乘,得到的数除以10,每整除一次count++;最后输出count;但这个方法不怎么行,因为阶乘很容易就溢出了

2.末尾有多少个0,说明他可以拆解成一个数跟多少个10相乘,
那么我们只需要计算它的因子里面有多少个10,
10的因子是1和10或者2和5,1和10就相当于1×2×5。
2的倍数比5的倍数的个数要多得多,所以只要能找到5,一定能找到一个2,
所以我们只需要判断每个累乘的数里有多少个因子5,总的因子5的个数就是结尾为0的个数;

试一下:

class Solution {
    public int trailingZeroes(int n) {
int count=0;
    for(int i=1;i<=n;i++)
    {
        if(i%5==0)
        {
            count++;
            int shang=i/5;
            while(shang%5==0)
            {
                count++;
                shang=shang/5;
            }
        }
    }
    return count;
    }
}

结果超时了
在这里插入图片描述
再分析:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15…20…25…30…50…75…100…125…
每5个数出现1个因子5;
那直接n/5不就好?
但是,25=5x5;出现两个5;
50=25x2,也就是25的倍数也会出现多个5;
所以,把n缩小5倍,n=n/5;

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

ok了
参考网址https://leetcode-cn.com/problems/factorial-trailing-zeroes/solution/xiang-xi-tong-su-de-si-lu-fen-xi-by-windliang-3/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值