美文网首页
阶乘后的零

阶乘后的零

作者: 兔子是黑老大 | 来源:发表于2019-03-06 14:31 被阅读0次

    tag 阶乘后0的个数

    题目

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

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

    示例 2:
    输入: 5
    输出: 1
    解释: 5! = 120, 尾数中有 1 个零.
    说明: 你算法的时间复杂度应为 O(log n) 。

    思路

    最容易想到的思路

    如果阶乘后面有0,那么结果一定是10的倍数,进而一定是2和5的倍数,从而得到了这样的代码

    public int trailingZeroes(int n) {
           int twoNumber = 0;
           int fiveNumber = 0;
            for(int i = 0; i <n;i++) {
                int k = i;
                while(k % 2 == 0 || k % 5 == 0) {
                    if(k % 2 == 0) {
                        twoNumber++;
                        k /= 2;
                    }
                        
                    if(k % 5 == 0) {
                        fiveNumber++;
                        k /= 5;
                    }       
                }
            }
           return twoNumber > fiveNumber ? fiveNumber : twoNumber;
        }
    

    将所有的数据从1到n(因为是n的阶乘)都过一遍,获取2和5的个数,并返回两个数个数最小的那个,这样才能组成10,但是这个算法对于大数会超时

    第二种方法

    也是我原来想不明白的,网上博客也是千篇一律,少了一个最重要的点。按照最容易的思路,还是要求2和5的倍数,但是由于阶乘的求法肯定是连着乘的,也就是1×2×3×4×5,你会发现只要出现5就一定会出现2,也就是网上博客说的只要统计5的个数就好了,那么关键点来了你统计谁的5的个数啊,是N还是N-1?这里要理解一个点,假设要求N的阶乘,那么我用\frac{n}{5}会得到什么呢?,暂且把\frac{n}{5}记做m,那么就有m × 5 = N这个意思是说N是5的倍数,而m代表的是在其内部[0,N-1]中还会出现5的倍数,出现的个数为m-1个,也就是说m是求和后的5的总个数。为什么这么说呢,举个例子假设N = 10那么2 × 5 = 10这样10中就是5的倍数,那么还会有1 × 5 = 5 ,那么5的倍数就是2个
    除了5的倍数,还有25的不熟也会致使结果出现0也就是会出现N /= 5这个表达式的原因,例如m * 25 = N就是N以内有m个25.
    代码实现

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

    相关文章

      网友评论

          本文标题:阶乘后的零

          本文链接:https://www.haomeiwen.com/subject/fkbtpqtx.html