题目:
Given an integer n, return the number of trailing zeroes in n!.
Note: Your solution should be in logarithmic time complexity.
思路:
在1到n这些数字中,能够贡献多少个因子5,就有多少个0.
因为0是由10得到的,而10=2*5;显然2的数量远多于5,因此0的个数等于5的个数。
对于n,在1~n的范围中,能够贡献5的有n/5个数,他们得到1个0;能够贡献25的有n/25个数,他们得到2个0,但是第一个0在之前已经计算了,所以只增加一个0;
能够贡献125的有n/125个数,同理,他们又多贡献了1个0,总共3个0;以此类推,总有n/5^k=0的时刻。
因此,我们将这些结果求和,即得到最终n!中的0的个数。
为了简化运算,我们不用让分母从5到25再到125...,而是让分子每次除以5.即n/5,n/5/5,n/5/5/5...
同时能够得到递推公式:count(n!)=n/5+count((n/5)!)
如果不使用以上思路或使用以上思路但没有简化运算,则一定会超时,因为在运算过程中,简化算法只使用了一次除法运算;而不简化算法,则会有多次乘除运算。
AC代码:
public int trailingZeroes(int n) {
int count=0;
while(n>=5){
n/=5;
count+=n;
}
return count;
}