1. 题目
给定一个整数 n,返回 n! 结果尾数中零的数量。
示例 1:
输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。
示例 2:
输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.
说明: 你算法的时间复杂度应为 O(log n) 。
Related Topics 数学
👍 470 👎 0
2. 题解
2.1 解法1: 暴力
思路: 计算多个个 0, 要产生 0, 需要 10, 10 由 5 * 2 得到, 而显然 2的个数比 5 要多很多, 所以所有 5的因子个数总和
即为 0的个数
class Solution {
public int trailingZeroes(int n) {
int count = 0;
for (int i = 1; i <= n; i++) {
int temp = i;
while (temp > 0) {
if (temp % 5 == 0) {
count++;
temp /= 5;
} else {
break;
}
}
}
return count;
}
}
2.2 解法2: 数学计算优化
基于解法1 的算法进行优化, 观察可以发现规律:
每隔 5 个数,出现一个 5,每隔 25 个数,出现 2 个 5,每隔 125 个数,出现 3 个 5… 以此类推
所以 5 的个数就是 n / 5 + n / 25 + n / 125 …
实际写代码时, 分母可能会溢出, 所以算 n / 25 的时候,我们先把 n 更新,n = n / 5,然后再计算 n / 5 即可。后边的同理
class Solution {
public int trailingZeroes(int n) {
int count = 0;
while (n > 0) {
count += n / 5;
n /= 5;
}
return count;
}
}