您的位置:首页 > 大数据 > 人工智能

leetcode 每日一题 172. Factorial Trailing Zeroes

2016-04-01 18:41 459 查看
典型的数学问题:

问题: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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: