返回

揭开 LeetCode 172 的奥秘:探索阶乘后的零

IOS

算法题解:步步解密

算法概述

给定一个正整数 n,求阶乘 n! 末尾有多少个零。

算法思路

我们知道,一个正整数 n! 的末尾会有若干个零,这是因为在计算阶乘的过程中,会遇到许多以 10 为因子的数字。而 10 可以分解为 2 和 5 的乘积,因此我们只需要计算 n! 中有多少个 2 和 5 的因子,就可以知道有多少个零。

算法步骤

  1. 初始化一个变量 count 为 0,表示阶乘 n! 末尾有多少个零。
  2. 从 2 开始遍历到 n,对于每个数字 i,计算有多少个 5 的因子和有多少个 2 的因子。
  3. 将 5 的因子的数量和 2 的因子的数量相加,并将其赋值给 count。
  4. 重复步骤 2 和步骤 3,直到遍历完所有数字 i。
  5. 返回 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 题的解法,并提供了优化后的代码实现。我们还讨论了算法的性能优化,包括时间复杂度和空间复杂度。希望这篇文章能对你有所帮助,也欢迎你在评论区留下你的想法和建议。