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

【leetcode】172. Factorial Trailing Zeroes

2016-06-16 16:00 405 查看
一、题目描述

Given an integer n, return the number of trailing zeroes in n!.

Note: Your solution should be in logarithmic time complexity.

题目解读:给一个数n,求n! 的后缀0的个数。解决方法的时间复杂度在log(n)内。

思路:说实话,这道题我一开始没看懂英文。(英语水平太渣,捂脸....)

首先想到的方法肯定是求出 n! 的值,然后从低位往高位遍历,统计0的个数直到遇到第一个非零数。

但是这种方法时间复杂度太高,并且数字稍大阶乘就会溢出,因此不可取。

从数学角度分析: 阶乘 n! 末尾0的个数是由其中因数2和因数5的个数决定。因此,我们只需求出因数2的个数和因数5的个数,取其中最小值就是我们所要的值。

举几个例子分析一下:

n = 5 时, 5!的质因子中(2* 2* 2* 3* 5)包含一个5和三个2,因此后缀0的个数是1。

n = 11时,11!的质因子中包含两个5和三个2,因此后缀0的个数是2。

很容易发现质因子中2的个数总是大于等于5的个数。因此只要统计5的个数就可以了。

对于计算 n! 的质因子中所有5的个数,同样举几个例子来分析一下:

观察 5!的质因子中有3个5(来自5,10,15),所以计算n/5就可以得到3。

观察25!的质因子中有6个5(来自5,10,15,20,25),这里25提供了2个5,因此除了算n/5,还要算n/5/5的值。

.....

总结起来就是计算n/5,n/5/5,n/5/5/5,...直到商为0。

c++代码(8ms,0.88%)

class Solution {
public:
int trailingZeroes(int n) {
int count = 0;
while(n>0){
int k = n/5;
count+=k;
n=k;
}
return count;
}
};

这道题确实需要好好分析才能写出代码。值得回味。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: