Given an integer n, return the number of trailing zeroes in n!.
Note: Your solution should be in logarithmic time complexity.
class Solution {
public:int trailingZeroes(int n) {
int count=0;
while (n!=0)
{
count += n/5;
n = n/5;
}
return count;
}
};
这个题也是一个很巧妙的题。一看到题,是不是想so easy,算出来看能除以几次10不就好了。nonono,看到对数时间复杂度了吗?你单算出来就已经是线性复杂度了,傻了吧。要想得到对数复杂度,寻常的做法肯定是不行的。能被10除理解的不够彻底,在阶乘的几个数中很可能一个能被5除,一个能被2除,配对后就可以被10除。并且,在阶乘中,2的数量不是问题,任何一个偶数都能被2整除,所以问题落在的5的个数上。我们再进一步想,整个阶乘的式子中能拆分成几个5呢。我们来举个栗子:52!,52/5=10,所以,小于52的数里有10x5,9x5...1x5.也就是说至少有10个数是可以拆分出5的。但是!!!你发现了什么,对,10x5和5x5这两个数还可以继续拆,写成2x5x5和1x5x5,也就是10/5=2。2之后不能再拆了,依次类推。其实就是对5前面的系数进行一层层的拆分,先都拆出一个5,再在新的系数上再拆,知道无法再拆为止。为什么说它是对数复杂度,因为5的k次幂大于n后就计算停止了,k为log5(n),对数复杂度。