链接
题目
给定一个整数
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 <= 10e4
思路
- 1.末尾有0,这个0必然是两个数相乘等于10得到的,而10的因数除了1和本身,就只有2和5,如6!=6*5*4*3*2*1=720, 720就是由72*10=6*4*3*1 * 5*2得到了,因此,末尾有多少个0,就看阶乘的所有数字里面能拆多少对2*5出来。再比如10!=10*9*8*7*6*5*4*3*2*1=3628800,这里有2个0,是因为,有10的2*5里的一个5,以及本身5的一个5,以及众多的2。
- 2.末尾有多少个0,取决于有多少对2和5,而从上面的例子我们可以看出,2的数量远远多于5,像2,4,6,8这些数里,都包含2,因此,最终有多少个0,取决于整个阶乘可以拆出多少个*5,如15!=15*....10*...5*....1,末尾的0的数量=1+1+1=3。
- 3.因此,本题转换成,从n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1里,可以拆除多少个5,这里我们只要考虑5的倍数的数,即5,10,15,20,25,30....,而5,10,15,20都只包含一个5,25=5*5包含2个5,125=5*5*5包含3个五,因此求有多少个5的代码可写成:
int count=0;
while(n>=5)
{
count=count+n/5; //从1到n,每隔5个数有一个*5,如5,10,15
n=n/5; //对于625,125,25这些数,包含不止1个5,需要再次累加
}
C++ Code
class Solution {
public:
int trailingZeroes(int n) {
int count=0;
while(n>=5){
count=count+n/5;
n=n/5;
}
return count;
}
};
此外,还可以一行解决。
class Solution {
public:
int trailingZeroes(int n) {
return n / 5 + n / 25 + n / 125 + n / 625 + n / 3125;
}
};
class Solution {
public:
int trailingZeroes(int n) {
return n < 5 ? 0 : n / 5 + trailingZeroes(n/5);
}
};