Leetcode 172 阶乘后的零(数学)
题目描述:
给定一个数n,求n的阶乘末尾零的个数。
题解:
一些规律:
- 末尾零的个数与这个数因子中10的个数有关。
- 10的质因子为2和5,10的个数可以转换为有多少个(2,5)对。然而一个数的质因子分解中,2的个数大于等于5的个数,也就是说末尾0的个数与质因子5的个数有关。
如果直接用质因子分解的方式求因子5的个数会超时,还需要改进。对于一个数的阶乘,就如之前分析的,5
的因子一定是每隔 5
个数出现一次,也就是下边的样子。
$n! = 1 * 2 * 3 * 4 * (1 * 5) * ... * (2 * 5) * ... * (3 * 5) *... * n$
因为每隔 5 个数出现一个 5,所以计算出现了多少个 5,我们只需要用 n/5 就可以算出来。但还没有结束,继续分析。
$... * (1 * 5) * ... * (1 * 5 * 5) * ... * (2 * 5 * 5) * ... * (3 * 5 * 5) * ... * n$
每隔 25 个数字,出现的是两个 5,所以除了每隔 5 个数算作一个 5,每隔 25 个数,还需要多算一个 5。也就是我们需要再加上 n / 25 个 5。同理我们还会发现每隔 5 * 5 * 5 = 125 个数字,会出现 3 个 5,所以我们还需要再加上 n / 125 。综上,规律就是每隔 5 个数,出现一个 5,每隔 25 个数,出现 2 个 5,每隔 125 个数,出现 3 个 5... 以此类推。最终 5 的个数就是 n / 5 + n / 25 + n / 125 ...
AC代码:
public int trailingZeroes(int n) { int count = 0; while (n > 0) { count += n / 5; n = n / 5; } return count; }