此题是求阶乘结果数字尾部有几个零
1)先计算阶乘,再计算尾部几个零
缺点:时间复杂度高,阶乘结果存在溢出的情况
class Solution {
public:
long long factorial(int n)
{
long long result=1;
while(n>0)
{
result*=n;
n--;
}
return result;
}
int trailingZeroes(int n) {
long long temp=factorial(n);
int count=0;
while(temp!=0)
{
int left=temp%10;
if(left==0)
count++;
else
break;
temp/=10;
}
return count;
}
};
2)若将整个阶乘进行因式分解,其结果尾部的0只能由5*2构成,而其中2的数目远远大于5的数目,尾部0的数目由阶乘中5的因子数目决定。
按照阶乘公司,每一个数进行对5的因式分解,将其中含有5的数目进行相加。
缺点:时间复杂度高
10!=5x2x9x2x2x2x7x3x2x5x2x2x3x2x1=3628800
class Solution {
public:
int factor(int n)
{
int result=0;
while(n!=0&&n%5==0)
{
result++;
n/=5;
}
return result;
}
int trailingZeroes(int n) {
int count=0;
int index=0;
while(index<=n)
{
int num=factor(index);
count+=num;
index+=5;
}
return count;
}
};
3)利用公式
num=N/5+N/(5^2)+…直到末项为0
举例如下:
30阶乘中含有5的数为30 25 20 15 10 5
30/5=6 表示有6个数含有5的因子
30/25=1 表示有1个数含有两个5的因子,上例中即为25
30/125=0 表示没有任何一个数含有3个5的因子
class Solution {
public:
int trailingZeroes(int n) {
int sum = 0;
while (n > 0) {
n /= 5;
sum += n;
}
return sum;
}
};