📅  最后修改于: 2023-12-03 14:58:39.176000             🧑  作者: Mango
阶乘是数学中常见的概念,表示从 1 到给定的数之间所有整数的乘积。如果一个阶乘的结果末尾有 n 个零,那么我们就称它为“阶乘乘以 n 个零结尾的数字”。本文将介绍如何计算并编程实现这个数。
在计算阶乘乘以 n 个零结尾的数字之前,我们需要先知道如何判断一个数末尾有多少个零。这里介绍一个简单的方法:一个数末尾有几个零,就相当于它能被多少个 10 整除。而 10 又可以分解为 2 和 5 的乘积,因此一个数末尾有几个零,就相当于它能被多少个 2 和 5 整除。显然,偶数中包含有大量的因子 2,因此我们只需要计算一个数能被多少个 5 整除即可。
具体来说,假设一个正整数 N,它能被 5 整除的次数为 k,则 N 的末尾就有 k 个零。N 能被 5 整除的次数为:
k = ⌊N/5⌋ + ⌊N/25⌋ + ⌊N/125⌋ + ...
其中 ⌊x⌋
表示不大于 x 的最大整数。例如,如果 N=100,那么 k=20,因为 100 能被 5 整除的次数是 20 次(它们分别是 5、10、15、20、...、95、100)。这个方法的时间复杂度为 O(logN)。
对于一个给定的 n,我们需要求出一个最小的数 x,使得 x! 末尾有 n 个零。这里的 x 就是“阶乘乘以 n 个零结尾的数字”。下面给出一种计算 x 的方法。
考虑到末尾有 n 个零的数一定能被 10^n 整除,因此我们只需要寻找一个最小的数 x,使得 10^n 整除 x! 即可。由于 10^n=2^n5^n,因此问题又转化为了找到一个最小的数 x,使得 2^n5^n 整除 x!。
对于 2^n,由于所有偶数都包含因子 2,因此我们只需要计算 x! 中因子 2 的个数,即可知道 2^n 能够被 x! 整除的次数。具体来说,设 f(x) 为 x! 中包含因子 2 的个数,则:
f(x) = ⌊x/2⌋ + ⌊x/4⌋ + ⌊x/8⌋ + ...
同理,对于 5^n,我们只需要计算 x! 中因子 5 的个数。由于每个不小于5的数字都包含因子5,因此我们只需要计算x!中包含数字5、10、15、20、...的个数,即:
g(x) = ⌊x/5⌋ + ⌊x/25⌋ + ⌊x/125⌋ + ...
我们发现 x! 能够被 2^n*5^n 整除,当且仅当 f(x) >= n 且 g(x) >= n。因此我们可以通过二分查找法,不断尝试不同的 x 直到找到一个最小的符合要求的数为止。
下面是一份 Python 代码的实现:
def trailingZeroes(n: int) -> int:
def f(x):
count = 0
while x:
x //= 2
count += x
return count
def g(x):
count = 0
while x:
x //= 5
count += x
return count
left, right = 0, 5 * n
while left < right:
mid = (left + right) // 2
if f(mid) >= n and g(mid) >= n:
right = mid
else:
left = mid + 1
return left
阶乘乘以 n 个零结尾的数字是一个数学上有趣的问题,也是面试中常见的考点。本文介绍了如何判断一个数末尾有多少个零以及如何计算阶乘乘以 n 个零结尾的数字。希望本文能对你有所启发,对你的工作和学习有所帮助。