Factorial Trailing Zeroes (easy)

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

Note: Your solution should be in logarithmic time complexity.

class Solution {

public:
    int trailingZeroes(int n) {
        int count=0;
        while (n!=0)
        {
            count += n/5;
            n = n/5;
        }
    return count;
    }

};

这个题也是一个很巧妙的题。一看到题,是不是想so easy,算出来看能除以几次10不就好了。nonono,看到对数时间复杂度了吗?你单算出来就已经是线性复杂度了,傻了吧。要想得到对数复杂度,寻常的做法肯定是不行的。能被10除理解的不够彻底,在阶乘的几个数中很可能一个能被5除,一个能被2除,配对后就可以被10除。并且,在阶乘中,2的数量不是问题,任何一个偶数都能被2整除,所以问题落在的5的个数上。我们再进一步想,整个阶乘的式子中能拆分成几个5呢。我们来举个栗子:52!,52/5=10,所以,小于52的数里有10x5,9x5...1x5.也就是说至少有10个数是可以拆分出5的。但是!!!你发现了什么,对,10x5和5x5这两个数还可以继续拆,写成2x5x5和1x5x5,也就是10/5=2。2之后不能再拆了,依次类推。其实就是对5前面的系数进行一层层的拆分,先都拆出一个5,再在新的系数上再拆,知道无法再拆为止。为什么说它是对数复杂度,因为5的k次幂大于n后就计算停止了,k为log5(n),对数复杂度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值