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.
首先这个题目的意思就是求n!这个数后面有几个0?题目限制就是时间效率,你遍历当然是不行的,比如:
class Solution {
public:
int trailingZeroes(int n) {
int num2=0,num5=0;//num2记录2因数的个数,num5记录5因数的个数
for(int i=1;i<=n;i++)
{
int tmp=i;
while((tmp%2)==0)
{
num2++;
tmp/=2;
}
while((tmp%5)==0)
{
num5++;
tmp/=5;
}
}
return min(num2,num5);//一个2和一个5组成一个10,故返还两者之间的小值
}
};
上面的代码是我直接能想到的,测试当然不能通过,后来突然意识到,2的因数一定比5的因数多,所以我们可以直接省略求解2因数这一步,代码如下:
class Solution {
public:
int trailingZeroes(int n) {
int num5=0;
for(int i=1;i<=n;i++)
{
int tmp=i;
while((tmp%5)==0)
{
num5++;
tmp/=5;
}
}
return num5;
}
};
但是时间效率还是能达到,这就难为小弟了,经高人指点,突然发现了下面高效的解决办法:
class Solution {
public:
int trailingZeroes(int n) {
int num5=0;
while(n)
{
num5+=n/5;
n/=5;
}
return num5;
}
};
上面代码的核心原理如下:
5因子的个数=[n/5]+[n/52]+...+[n/5k]
其中5k<=n