给定一个整数 n,返回 n! 结果尾数中零的数量。
示例 1:
输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。
示例 2:
输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.
说明: 你算法的时间复杂度应为 O(log n) 。
思路分析:不难发现,只用出现2的倍数、5的倍数相乘才会在末尾出现零。并且2的倍数出现的次数肯定多余5的倍数出现的次数。所以这道题就转换为1~n中,5出现的次数(需要注意5的次方)。
方法一:计算5出现的次数,被5整除的数计算1次,被25整除的数计算2次,被125整除的数计算3次…
但是在计算被5整除的数时被25整除的数(5t)已经被计算了一次,所以再计算被25整除的数只要计算一次。
在计算被5、25整除的数中,被125整除的数各被计算了一次,所以再计算被125整除的数中只要计算一次。
…
class Solution {
public:
int trailingZeroes(int n) {
return n / 5 + n / 25 + n / 125 + n / 625 + n / 3125 + n / 15625 + n / 78125 + n / 390625 + n / 1953125 + n / 9765625 + n / 48828125 + n / 244140625 + n / 1220703125;
}
};
方法二:将上面的方法转化为递推。
class Solution {
public:
int trailingZeroes(int n) {
int ans=0;
while(n>0)
{
n=n/5;//随着迭代的推进相当于n的起始值分别除5,25,125...
ans=ans+n;
}
return ans;
}
};