题目描述:
172. Factorial Trailing Zeroes
Given an integer n, return the number of trailing zeroes in n!.
Note: Your solution should be in logarithmic time complexity.
解题思路:
10 = 2*5,同时注意到如果一个数注意到n!末尾0的个数即为从1到n的所有数的因子中5的个数,所以本题第一个想法就是从1到n遍历,算出每个数的因子中5的个数,从而得到解。然而当n很大时这种解法会超时。(见代码1)
之后考虑等式n!=(5*k*5*(k-1)*...*10*5)*a,其中(n=5k+r,r<5),之后将其中所有的5提出来就可以得到n!=pow(5,k)*k!*a(见代码二),由此式得到n!结尾0的个数实际上等于k+k!结尾0的个数,所以由此可以得到一个递归形式的解,见代码二。
代码展示:
如代码一
//代码一
//算出1~n之间所有数的因子中5的个数
class Solution {
public:
void num_zero(int n,int &num_five)
{
while(n%5==0)
{
num_five++;
n/=5;
}
}
int trailingZeroes(int n) {
if(n<5) return 0;
int num_five =0;
for(int i=1;i<=n ; i++)
{
num_zero(i,num_five);
}
return num_five;
}
};
//代码二
class Solution {
public:
int trailingZeroes(int n) {
if(n<5)
return 0;
else
return n/5+trailingZeroes(n/5);
}
};