返回
揭开 LeetCode 172 的奥秘:探索阶乘后的零
IOS
2023-10-27 05:09:35
算法题解:步步解密
算法概述
给定一个正整数 n,求阶乘 n! 末尾有多少个零。
算法思路
我们知道,一个正整数 n! 的末尾会有若干个零,这是因为在计算阶乘的过程中,会遇到许多以 10 为因子的数字。而 10 可以分解为 2 和 5 的乘积,因此我们只需要计算 n! 中有多少个 2 和 5 的因子,就可以知道有多少个零。
算法步骤
- 初始化一个变量 count 为 0,表示阶乘 n! 末尾有多少个零。
- 从 2 开始遍历到 n,对于每个数字 i,计算有多少个 5 的因子和有多少个 2 的因子。
- 将 5 的因子的数量和 2 的因子的数量相加,并将其赋值给 count。
- 重复步骤 2 和步骤 3,直到遍历完所有数字 i。
- 返回 count。
代码实现
def trailing_zeros(n):
"""
计算阶乘 n! 末尾有多少个零。
参数:
n: 一个正整数。
返回:
阶乘 n! 末尾有多少个零。
"""
# 初始化 count 为 0。
count = 0
# 从 2 开始遍历到 n。
for i in range(2, n + 1):
# 计算有多少个 5 的因子。
num_fives = 0
while i % 5 == 0:
num_fives += 1
i //= 5
# 计算有多少个 2 的因子。
num_twos = 0
while i % 2 == 0:
num_twos += 1
i //= 2
# 将 5 的因子的数量和 2 的因子的数量相加。
count += min(num_fives, num_twos)
# 返回 count。
return count
# 测试代码。
print(trailing_zeros(5)) # 1
print(trailing_zeros(10)) # 2
print(trailing_zeros(25)) # 6
性能优化
时间复杂度
上述算法的时间复杂度为 O(log n),其中 n 为给定的正整数。这是因为在计算阶乘 n! 末尾有多少个零的过程中,我们只需要遍历从 2 到 n 的所有数字,对于每个数字 i,我们只需要计算有多少个 5 的因子和有多少个 2 的因子,而计算这些因子只需要花费常数时间。
空间复杂度
上述算法的空间复杂度为 O(1),这是因为我们只需要使用几个变量来存储中间结果,而这些变量的大小都是常数。
总结
在本文中,我们详细地讲解了 LeetCode 172 题的解法,并提供了优化后的代码实现。我们还讨论了算法的性能优化,包括时间复杂度和空间复杂度。希望这篇文章能对你有所帮助,也欢迎你在评论区留下你的想法和建议。