Factorial Trailing Zeroes - Javacript

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

Note: Your solution should be in logarithmic time complexity.

Credits:
Special thanks to @ts for adding this problem and creating all test cases.

Tags

Math

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

这道题考察的其实是数学知识,来看一下规律。

乘积产生0 也就意味着这个数字分解之后,得到Math.min(2的个数,5的个数)

5 = 5x4x3x2x1 1个5 1个2 => 1个0

6 = 6x5x4x3x2x1 1个5 1个2 => 1个0

10 = 10x9x8x7x6x5x4x3x2x1 2个5 8个2 => 2个0

...

可以看出2始终比5要多,0的个数根据分解出的因子5的个数来定的,因此我们可以算出1~n中,包含5的个数

另外需要注意的是25,125... 本身包含多个5,也是需要囊括进去的。例如28,1~28中,包含5 10 15 20 25,

需要注意的是,25包含两个5, 也因此 28 有 Math.floor(28/5) + 1 = 6个5。

n!后缀0的个数 = n!质因子中5的个数 = floor(n/5) + floor(n/25) + floor(n/125) + ....

/**
 * @param {number} n
 * @return {number}
 */
var trailingZeroes = function (n) {
    var divider = 5;
    var ret = 0;

    while (n >= divider) {
        ret += Math.floor(n / divider);
        divider = divider * 5;
    }

    return ret;
};






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值