2.尾部的零
设计一个算法,计算出n阶乘中尾部零的个数
样例
11! = 39916800,因此应该返回 2
分析
两个大数字相乘,都可以拆分成多个质数相乘,而质数相乘结果尾数为0的,只可能是2*5。而在某个范围内5的个数必定比2少,因为每隔2个数就有会出现因子2。
对于一个正整数n来说,怎么计算n!中5因子的个数呢?我们可以把5的倍数都挑出来,即:
令
n! = (5*K) * (5*(K-1)) * (5*(K-2)) * ... * 5 * A
,
其中A就是不含5因子的数相乘结果,
n = 5*K + r(0<= r <= 4)
。
假设f(n!)是计算阶乘n!尾数0的个数,那么就会有如下公式:
f(n!)
= f((5*K) * (5*(K-1)) * (5*(K-2)) * ... * 5 * A)
= f(5^K * K! * A)
= K + f(K!) ,其中K=n / 5(取整数)。
这里5的个数与0的个数一一对应,因而5^K共有K个5,K!*A里则有f(K!)个5,A不包含因子5,所以可以去掉A,故共有K+f(K!)个5。
最终代码如下
class Solution {
public:
long long trailingZeros(long long n) {
return trailingNum_Number(n,0);
}
long long trailingNum_Number(long long n,long long number){
if(n/5==0){
return number;
}else{
return trailingNum_Number(n/5,number+n/5);
}
}
};