题目描述
给定一个整数 n,返回 n! 结果尾数中零的数量。
样例
输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。
输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.
说明: 你算法的时间复杂度应为 O(log n) 。
算法分析
- 1、假设 $n! = k$,
k
尾后又多少个0
,取决于k
能分解出多少个10
,由于10 = 2 * 5
,因此k
尾后有多个10
,取决于k
有能分解出多少个2
和5
, - 2、假设 $n! = k = 2^a \times 5^b \times .... $,则求
k
尾后有多少个10
,等价于求Min(a, b)
; - 3、如何求
2
的次数a
和5
的次数b
的值,P = 2
和P = 5
,枚举质因子P
,n!
表示1 * 2 * 3... * n
,从1
到n
中,求P
的次数:$\lfloor \frac{n}{p} \rfloor + \lfloor \frac{n}{p^2} \rfloor + \lfloor \frac{n}{p^3} \rfloor …$(一共有$log_{p}n$项)P
的倍数有$\lfloor \frac{n}{p} \rfloor$个P^2
的倍数有$\lfloor \frac{n}{p^2} \rfloor$个P^3
的倍数有$\lfloor \frac{n}{p^3} \rfloor$个- …
- 4、又由于$\lfloor \frac{n}{2} \rfloor + \lfloor \frac{n}{2^2} \rfloor + \lfloor \frac{n}{2^3} \rfloor … > \lfloor \frac{n}{5} \rfloor + \lfloor \frac{n}{5^2} \rfloor + \lfloor \frac{n}{5^3} \rfloor …$,因此只需要求出
5
的次数即可,即是阶乘尾后0
的个数
时间复杂度 $O(log_{5}n)$
Java 代码
class Solution {
public int trailingZeroes(int n) {
int res = 0;
while(n != 0)
{
res += n / 5;
n /= 5;
}
return res;
}
}
太强了,上课y总讲的有点快,这篇帖子全能看得懂
写的很好,但是一个地方写错了,算法分析:
- 2、$n!=2^a+5^b+…$这里应该是分解质因子$n! = 2^a \times 5^b …$
已修改,谢谢大哥提醒
请问下大佬,咱们不是推导的是求n!当中有几个5嘛?
为啥代码里直接求n里面有几个5就可以了呢?
不是
n
里面有几个5
,而是[1, n]
区间有几个5
emm, 这就能等价 n!里面 有几个5嘛
嗯,在区间
[1, n]
中,n / 5
表示这个区间有多少个数可以整除5
,例如[1,16]
区间,有5
,10
,15
,这个3
个数可以整除5