【leetcode】172. Factorial Trailing Zeroes

一、题目描述

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;
    }
};


这道题确实需要好好分析才能写出代码。值得回味。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值