Given an integer n, return the number of trailing zeroes in n!.
Note: Your solution should be in logarithmic time complexity.
最开始想到的是使用阶乘的方法:
int trailingZeroes(int n) {
if(n==0) return 0;
if(n==1) return 0;
int sum=1;
int b=0;
for(int temp=2;temp<=n;temp++){
sum=temp*sum;
if(sum%5==0){
b++;
sum=sum/5;
}
}
return b;
}
很明显会超时,因为要从1到n是线性时间的,而要求是对数时间的。所以遍历是不对的,对阶乘结果分析,产生尾0的原因是:存在以5为约数的因子,只要求出有多少个5就行,同时要注意25=5*5,125=5*5*5.所以还要求25,125. . .的个数,代码如下:
int trailingZeroes(int n) {
/*if(n==0) return 0;
if(n==1) return 0;
int sum=1;
int b=0;
for(int temp=2;temp<=n;temp++){
sum=temp*sum;
if(sum%5==0){
b++;
sum=sum/5;
}
}
return b;*/
int b=0;
while(n/5!=0){
b=n/5+b;
n=n/5;
}
return b;
}