原题链接:Leetcode 172.Factorial Trailing Zeroes
Given an integer n
, return the number of trailing(拖尾的) zeroes in n!
.
Note that n! = n * (n - 1) * (n - 2) * … * 3 * 2 * 1.
Example 1:
Input: n = 3
Output: 0
Explanation: 3! = 6, no trailing zero.
Example 2:
Input: n = 5
Output: 1
Explanation: 5! = 120, one trailing zero.
Example 3:
Input: n = 0
Output: 0
Constraints:
- 0 <= n <= 104
Follow up: Could you write a solution that works in logarithmic time complexity?
做法一:数学
思路:
n! 尾零的数量即为 n! 中因子 10 的个数。
因子10的个数也就是因子2和因子5中数量较小的那个(其实因子5的个数就是会比因子2的个数小),因此只要统计[1, n]中5的倍数,将他们各自的5的因子个数的数量求总和即可
c++代码:
class Solution {
public:
int trailingZeroes(int n) {
int ans = 0;
for(int i = 5; i <= n; i += 5){
// 累计它的因子5的个数
for(int x = i; x % 5 == 0; x /= 5){
++ans;
}
}
return ans;
}
};
python3代码:
class Solution:
def trailingZeroes(self, n: int) -> int:
ans = 0
for i in range(5, n + 1, 5):
while i % 5 == 0:
i //= 5
ans += 1
return ans
复杂度分析:
- 时间复杂度:O(n), n!中因子5的个数是O(n)级别
- 空间复杂度:O(1)