leetcode 172. 阶乘后的零
问题描述
给定一个整数 n,返回 n! 结果尾数中零的数量。
示例 1:
输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。
示例 2:
输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.
说明: 你算法的时间复杂度应为 O(log n) 。
问题分析
零是由\(2\times5\)产生的,因为如果有5的出现,一定有2与之配对,因此只要考虑\(n!\)中有多少个5就行了。但是这样的复杂度是O(n)的,与题目要求不符,且超出了时间限制。例如 5! = 1 * 2 * 3 * 4 * 5一个2和一个5配对出现0, 所以5!末尾只有一个零, 而在 n = 25 时 可以产生5的有 5 10 15 20 25 ,即 n/5 = 5个 然而 25 = 5*5, 所以少算了一个5, n>=25时,故而需要补上它, 因此所有可以产生25的也要加上 :即为 n/5 + n/25 然而 125 = 5*25, 所以又少算了一个5,n>=125时,故而需要补上它 因此所有可以产生125的也要加上:即为 n/5 + n/25 + n/125, 然而 625 = 5*125 所以又少算了一个5,继续补上...所以最终为 n/5 + n/25 + n/125 + n/625 + ... 即 n/5 + n/5/5 + n/5/5/5 + n/5/5/5/5 + ...
代码1(超出时间限制)
class Solution {
public:
int trailingZeroes(int n) {
int count=0,i;
if(n < 5)return 0;
for(i = 5; i <= n; i++)
{
int N = i;
while(N != 0)
{
if(N % 5 == 0)
{
count++;
N /= 5;
}
else{
break;
}
}
}
return count;
}
};
代码2
class Solution {
public:
int trailingZeroes(int n) {
int count=0;
while(n != 0)
{
count += n/5;
n /= 5;
}
return count;
}
};
结果:
执行用时 :4 ms, 在所有 C++ 提交中击败了70.09%的用户
内存消耗 :8.1 MB, 在所有 C++ 提交中击败了64.07%的用户