题目

给定一个整数 n ,返回 n! 结果中尾随零的数量。

提示 n! = n (n - 1) (n - 2) 3 2 1

示例 1:

输入:n = 3
输出:0
解释:3! = 6 ,不含尾随 0
示例 2:

输入:n = 5
输出:1
解释:5! = 120 ,有一个尾随 0
示例 3:

输入:n = 0
输出:0

提示:

0 <= n <= 10^4

进阶:你可以设计并实现对数时间复杂度的算法来解决此问题吗?

思路

阶乘因子中,172. 阶乘后的零 - 图1的来源都可以拆成172. 阶乘后的零 - 图2172. 阶乘后的零 - 图3的乘积,比如172. 阶乘后的零 - 图4172. 阶乘后的零 - 图5172. 阶乘后的零 - 图6不是质因子,而172. 阶乘后的零 - 图7172. 阶乘后的零 - 图8是,那么我们统计172. 阶乘后的零 - 图9172. 阶乘后的零 - 图10的数目就好了。而由于172. 阶乘后的零 - 图11的数目一定不少于172. 阶乘后的零 - 图12,所以统计172. 阶乘后的零 - 图13的数目就好了。即统计172. 阶乘后的零 - 图14172. 阶乘后的零 - 图15中每个数最多可以拆出多少个172. 阶乘后的零 - 图16

首先,每隔一个172. 阶乘后的零 - 图17会出现172. 阶乘后的零 - 图18的倍数,每个数含172. 阶乘后的零 - 图19172. 阶乘后的零 - 图20,总共贡献172. 阶乘后的零 - 图21172. 阶乘后的零 - 图22。每隔172. 阶乘后的零 - 图23会出现一个172. 阶乘后的零 - 图24的倍数,每个数含再贡献一个172. 阶乘后的零 - 图25,又多贡献172. 阶乘后的零 - 图26172. 阶乘后的零 - 图27。以此类推,这个间隔最大是小于172. 阶乘后的零 - 图28的最大的172. 阶乘后的零 - 图29的次方数。

举个例子,172. 阶乘后的零 - 图30172. 阶乘后的零 - 图31,从172. 阶乘后的零 - 图32开始,每隔172. 阶乘后的零 - 图33出现一个172. 阶乘后的零 - 图34的倍数,总共出现172. 阶乘后的零 - 图35172. 阶乘后的零 - 图36。从172. 阶乘后的零 - 图37开始,每隔172. 阶乘后的零 - 图38出现一个172. 阶乘后的零 - 图39的倍数,再多贡献172. 阶乘后的零 - 图40172. 阶乘后的零 - 图41,一共出现172. 阶乘后的零 - 图42172. 阶乘后的零 - 图43。也就是有172. 阶乘后的零 - 图44172. 阶乘后的零 - 图45

代码

  1. class Solution {
  2. public int trailingZeroes(int n) {
  3. int ans = 0;
  4. for (int i = 1; (int) Math.pow(5, i) <= n; i++) {
  5. ans += n / (int) Math.pow(5, i);
  6. }
  7. return ans;
  8. }
  9. }