阶乘后的零(简单)
2020年5月22日
题目来源:力扣
解题思路
1.理解这个尾数的意义,是指末尾有几个连续的0
2.用阶乘后的结果取余求0的个数,结果会溢出,就算用BigInteger也不理想
从题解学到的思路
1.首先我们要判断末尾有0是什么意思,从因式分解来看,只有25会产生10(也就是0),那不管一个数是350还是250,只要乘10,末尾就会多了个0,10=2X5,那就可以看出这道题是可以通过因式分解判断有多少个10,进一步来看就是看有多少个25。
2.那么我们要判断2和5的个数吗?答案是否定的。
看例子:
11! = 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 11 * (2 * 5) * 9 * (4 * 2) * 7 * (3 * 2) * (1 * 5) * (2 * 2) * 3 * (1 * 2) * 1
对于含有 2 的因子的话是 1 * 2, 2 * 2, 3 * 2, 4 * 2 …
对于含有 5 的因子的话是 1 * 5, 2 * 5…
含有 2 的因子每两个出现一次,含有 5 的因子每 5 个出现一次,所有 2 出现的个数远远多于 5。
换言之找到一个 5,一定能找到一个 2 与之配对。所以我们只需要找有多少个 5。
直接的,我们只需要判断每个累乘的数有多少个 5 的因子即可。
3.因为每隔 5 个数出现一个 5,所以计算出现了多少个 5,我们只需要用 n/5 就可以算出来。
每隔 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 …
写程序的话,如果直接按照上边的式子计算,分母可能会造成溢出。所以算 n / 25 的时候,我们先把 n 更新,n = n / 5,然后再计算 n / 5 即可。后边的同理。
class Solution {
public int trailingZeroes(int n) {
int count=0;
while(n>0){
count+=n/5;
n/=5;
}
return count;
}
}