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;
}
原文地址:https://www.cnblogs.com/z1141000271/p/12680463.html