典型的数学问题:
问题:N的阶乘(N!)中的末尾有多少个0?
例如:N = 5,N! = 120.末尾有1个0.
分析:想到这个问题,有人可能第一反应就是现求出N!,然后再根据求出的结果,最后得出N!的末尾有多少个0。
其实可以考虑为,哪些数相乘可以得到10 这个角度,由于2*5为十,且分解后5的个数肯定小于2,所以在这个阶乘中10的幂M可以由1~N中有多少个5来决定
因此转换为求问题:1-N中有多少个5?
一开始用的笨方法是,从1~N中直接求每个数的5的指数,但是超时
int trailingZeroes(int n) {
int zero=0;
long long int i,j;
if(n<5) return 0;
for(i=5;i<=n;i+=5){ //此处优化,i+=5
j=i; //j要替代i 不然i的值就变了
while(j!=0){
if(j%5==0){
zero++;
}
j=j/5;
}
}
return zero;
}
//此方法超时
后来发现,求5的指数,肯定是5,25,125这些数,因此可以用这个公式来求:
Z = N/5 + N /(5*5) + N/(5*5*5).....知道N/(5的K次方)等于0
公式中 N/5表示不大于N的数中能被5整除的数贡献一个5,N/(5*5)表示不大于N的数中能被25整除的数再共享一个5
class Solution {
public:
int trailingZeroes(int n) {
int zero=0;
while(n!=0){
zero+=n/5;
n=n/5;
}
return zero;
}
};
更直观的代码在discuss中也有: https://leetcode.com/discuss/89805/sharing-my-4ms-c-solution
class Solution {
public:
int trailingZeroes(int n) {
int result=0;
long long int i;
for(i=5; i<=n; i=i*5)
result += n/i;
return result;
}
};