LeetCode—阶乘后的零

阶乘后的零(简单)

2020年5月22日

题目来源:力扣

在这里插入图片描述

解题思路
1.理解这个尾数的意义,是指末尾有几个连续的0
2.用阶乘后的结果取余求0的个数,结果会溢出,就算用BigInteger也不理想

从题解学到的思路
1.首先我们要判断末尾有0是什么意思,从因式分解来看,只有25会产生10(也就是0),那不管一个数是350还是250,只要乘10,末尾就会多了个0,10=2X5,那就可以看出这道题是可以通过因式分解判断有多少个10,进一步来看就是看有多少个25。

2.那么我们要判断2和5的个数吗?答案是否定的。

看例子:
11! = 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 11 * (2 * 5) * 9 * (4 * 2) * 7 * (3 * 2) * (1 * 5) * (2 * 2) * 3 * (1 * 2) * 1

对于含有 2 的因子的话是 1 * 2, 2 * 2, 3 * 2, 4 * 2 …
对于含有 5 的因子的话是 1 * 5, 2 * 5…

含有 2 的因子每两个出现一次,含有 5 的因子每 5 个出现一次,所有 2 出现的个数远远多于 5。

换言之找到一个 5,一定能找到一个 2 与之配对。所以我们只需要找有多少个 5。

直接的,我们只需要判断每个累乘的数有多少个 5 的因子即可。

3.因为每隔 5 个数出现一个 5,所以计算出现了多少个 5,我们只需要用 n/5 就可以算出来。
每隔 25 个数字,出现的是两个 5,所以除了每隔 5 个数算作一个 5,每隔 25 个数,还需要多算一个 5。

也就是我们需要再加上 n / 25 个 5。

同理我们还会发现每隔 5 * 5 * 5 = 125 个数字,会出现 3 个 5,所以我们还需要再加上 n / 125 。

综上,规律就是每隔 5 个数,出现一个 5,每隔 25 个数,出现 2 个 5,每隔 125 个数,出现 3 个 5… 以此类推。

最终 5 的个数就是 n / 5 + n / 25 + n / 125 …

写程序的话,如果直接按照上边的式子计算,分母可能会造成溢出。所以算 n / 25 的时候,我们先把 n 更新,n = n / 5,然后再计算 n / 5 即可。后边的同理。

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

在这里插入图片描述

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 像素格子 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读