题目
给定一个整数 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; }