https://leetcode-cn.com/problems/factorial-trailing-zeroes/
172. 阶乘后的零
这题要完成其实要知道一个很巧妙的思想,就是阶乘里面,后面的几个零是由什么来决定的。
只有知道了这个,才能够在足够小的时间复杂度中得到答案。
其实乘法里面,末尾有0意味着因子中肯定有10,而10的质因子,就是5
和 2
,所以,我们要看末尾有没有5,为啥直接看阶乘中的数字的包含的5的质因子的总数就可以了?不用看2的么?主要是5比2大,如果有5的质因数,那么肯定比如包含2,比如5!:
1
∗
2
∗
3
∗
4
(
2
∗
2
)
∗
5
1 * 2 * 3 * 4(2 * 2) * 5
1∗2∗3∗4(2∗2)∗5,仔细观察,5的阶乘中5的总数只有1个,但是2的总数有3个。所以我们直接看5的数量就可以了。
5 : 1
10 : 2
15 : 3
20 : 4
25 : 6
30 : 7
35 : 8
40 : 9
45 : 10
50 : 12
……
那么这里你肯定发现了一个问题,就是为啥在25的时候一次洗由4加到了6?其实究其原因就是,我们之前一直在找
2
∗
5
2 * 5
2∗5的数量,但是
4
∗
25
4 * 25
4∗25 也可做到后面有0。所以这里就多出了一个5的质因子的总数,因为25也是要分解成
5
∗
5
5 * 5
5∗5。
我们来看看代码:
Show the code
public int trailingZeroes(int n) {
int res = 0;
while (n >= 5) {
res += n / 5;
n = n / 5;
}
return res;
}
这是个循环累加的过程,所以,如果出现了25,125, 625……就是要不断的分解成5的质因数,然后计数。