描述
给定一个整数 n,计算出n!中尾部零的个数。
样例1
输入5,输出1。
解释
5!=120,有一个零。
样例2
输入11,输出2。
解释
11!=39916800,有两个零。
分析
在十进制中一个数末尾的每一个零,都意味着有一个因数10存在,因此,我们可以将1 * 2 * 3 * 4 * 5 * ··· * n分解质因数为1 * 2 * 3 *(2 * 2) * 5 * (2 * 3) * 7··· * n,每个10可以被分解为2 * 5 ,因此只有2 * 5会产生10 ,因此一个数尾部的零实际上取决于2与5的组合有多少对,于是统计尾部的零的个数就被转化为了统计2与5配对的数量,同时不难看出,2作为质因数显然远多于5,因此2与5配对的数量显然取决于5的数量,于是尾部的零又可以被转化为统计质因数中5的个数。
在序列1、2、3、4、5、6、7、8、9、10、11、…n中,不难发现,每五个数中就有一个5的倍数:5,10,15,20···
于是我们可以用count=n/5来统计这些数的个数。
将这些数提取出来除以5,可以得到:5 * (1,2,3,4,5,6,7,8,9,10,11···)其中的1,2,3,4,5···又满足上述分析。
因此,我们发现,又可以获得:5*(5,10,15,20,25···)的数列,其中又有n/5/5个(5 * 5)的倍数。
因为25、50、75、100、125、…它们都满足相乘后产生至少两个0,在第一次5 * k的分析中已经统计过一次。因此此处的5 * 5 * k只要统计一次即可,不需要根据25是5的二次幂统计两次。
而后面的125,250,…等乘积为1000的可以为结果贡献3个0的数字,只要在5 * 5 * k的基础上再统计一次n/5/5/5即可。
所以,尾部的零的计算就是累计质因数5的总数。
代码
public class Solution {
/**
* @param n: A long integer
* @return: An integer, denote the number of trailing zeros in n!
*/
public long trailingZeros(long n) {
// write your code here
long count=0;
while(n!=0){
count+=n/5;
n=n/5;
}
return count;
}
}