题目
Given an integer n, return the number of trailing zeroes in n!.
Note: Your solution should be in logarithmic time complexity.
中文大意
给定整数n,返回改整数阶乘n!结果的尾随零的个数
分析
直观的思路是:先求出阶乘结果n!,然后循环计算出n!%10 得到尾随0的个数,这样的做法容易出现超出数据类型范围的情况。现在换一种思路,求阶乘结果的尾随0数m,即阶乘结果是10^m的倍数,而10 = 5 * 2,而n! = n * (n-1)*...*2*1,那么只需要求出,将1到n这n个数分别分解成质数因子的乘积中,所有因数5的个数或因数2的个数的最小值,由于2的个数一定比5的个数多,所以只需要求出在这n个数的质因子中5的总个数count。
假设n= 627,在1.....627中,只要隔5个数就会得到一个5的倍数,627/5 = 125 就可以得到:这627个数字中有125个数分别可以分解出一个质因子5,但是这依然没有完成我们的要求,因为在第一次求出count=125的基础上,在25,50,75,100等这些数字里还可以再分解出质因子5,而125,250等数字里还可以分别分解出2个质因子5,625中还可以分解出3个质因子,那么还需要将这些质因子的个数加在count上,那么就需要计算n个数中,多少个25的倍数;n个书中,多少个125的倍数......。最终count的计算公式为count = n/5 + n/25+n/125 +n/(5^4)+....直到n/(5^x) == 0为止。
java代码实现
class Solution {
public int trailingZeroes(int n) {
int count = 0;
while(n> 0){
n /= 5;
count += n;
}
return count;
}
}