. 尾部的零
设计一个算法,计算出n阶乘中尾部零的个数
样例
n! 这个数的质因子中有几对2*5,尾部就有几个0
因为质因子中2的个数要比5多,所以质因子中有几个5,尾部就有几个0
以105为例
105!=1*2*3*。。。。*105
首先可以知道其中(5*(1、2/3/4/5.。。)) 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 105
这21个数都有质因子5,所以阶乘尾部至少有21个0
然后(5*5*(1、2/3/4/5.。。)) 25 50 75 100这些数有两个质因子5,所以阶乘尾部至少有21+4=25个0
然后(5*5*5*(1、2/3/4/5.。。)) 没有数
所以最后又25个0
11! = 39916800,因此应该返回 2
/**
* 尾部的零
* @param n: An integer
* @return: An integer, denote the number of trailing zeros in n!
*
* 1*2*3*...*n
* n! 这个数的质因子中有几对2*5,尾部就有几个0
* 因为质因子中2的个数要比5多,
* 所以质因子中有几个5,尾部就有几个0
*
* 5 10 15 ...能贡献一个质因子5
* 25 50 75...在上层基础上,能再贡献一个5
* 125...在上层基础上,能再贡献一个5
*/
public long trailingZeros(long n) {
long result=0;
long five=5;
while(n>=five) {
result+=n/five;
five*=5;
}
return result;
}
1*2*3*...*n
n! 这个数的质因子中有几对2*5,尾部就有几个0
因为质因子中2的个数要比5多,所以质因子中有几个5,尾部就有几个0
以105为例
105!=1*2*3*。。。。*105
首先可以知道其中(5*(1、2/3/4/5.。。)) 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 105
这21个数都有质因子5,所以阶乘尾部至少有21个0
然后(5*5*(1、2/3/4/5.。。)) 25 50 75 100这些数有两个质因子5,所以阶乘尾部至少有21+4=25个0
然后(5*5*5*(1、2/3/4/5.。。)) 没有数
所以最后又25个0