阶乘后的零(力扣第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;
}
posted @ 2020-06-03 12:42  有心有梦  阅读(141)  评论(0编辑  收藏  举报