• 阶乘后的零(力扣第172题)


    题目

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

    分析:

      求尾数为0的个数,那就要分析如何才能使得尾数会有0,其实就是在求阶乘运算的过程中存在10这个因子,继续分解,实质就是存在2和5这两个因子,有多少个2*5,则结尾就会有多少个0,而2*5个的个数,其实受限于5的个数,因为2是一个较小的值,且是更多数的因子,因此对于0-n这些数中,能够分解出的5的个数一定是小于分解出的2的个数的。所以能够分解出多少个5,那么尾数就会有多少个0。

      那么如何求出能够分解出的5的个数呢,我们来找一下规律,假如:

      n = 5时,5!= 1*2*3*4*5,能够分解出的5这个因子的个数是1个;

      n = 6时,6!= 1*2*3*4*5*6 ,能够分解出的5这个因子的个数是1个;

      n = 10时,10! = 1*2*3*4*5*6*7*8*9*10,能够分解出的5这个因子的个数是2个;

      n = 30时,30!= 1*2*……*25*26*27*28*29*30,能够分解出的5这个因子的个数是7个;

      从以上的规律可以看出,能够分解出5这个因子的数都是5的倍数,所以n/5可以求出不大于n的情况下,5的倍数的个数,那么有多少个5的倍数就会提取出多少个因子5,但是,这还没有结束,看上边最后一个例子,30的阶乘,为啥分解出因子5的个数是7个而不是6个,原因在于25这个数的存在,它能够分解出两个因子5,所以n的阶乘能够一共分解出7个因子5。

      所以不大于n时,n/25可以求出25倍数的个数,那就可以再提取相应个数的因子5出来;然后继续判断n/5^3   ……

    最终5的个数是:n/5 + n/5^2 + n/5^3+……

    代码实现:

    public int trailingZeroes(int n) {
        if (n < 5){
                return 0;
        }
        int res = 0;
        while (n != 0){
            res += n / 5;
            n = n/5;
        }
        return res;
    }
  • 相关阅读:
    Android应用开发SharedPreferences存储数据的使用方法
    Android ListView不响应OnItemClickListener解决办法
    Java 毫秒转换为日期类型、日期转换为毫秒
    关于android软键盘enter键的替换与事件监听
    如何使用adb命令查看android中的数据库
    android坐标
    getHitRect获取点击控件的位置
    UTC的相互转换(java)
    深入理解Android的startservice和bindservice
    TS格式解析
  • 原文地址:https://www.cnblogs.com/yxym2016/p/13036838.html
Copyright © 2020-2023  润新知