lintcode入门级-计算出n阶乘中尾部零的个数

题目地址:https://www.lintcode.com/problem/trailing-zeros/description

我想法很简单,算出数值大小,直接对尾部进行除法取余找0:

(function () {
        var trailingZeros = function (n) {
            var sum = 1;
            for (var i = 1; i <= n; i++) {
                sum *= i;
                console.log(sum);
            }
            var t = 0;
            for (var j = 0; sum % 10 == 0;j++) {
                sum = sum /10;
                t++;
            }
            console.log(t);
            return t
        };
       
    })()

简单粗暴,完全不考虑其他,毫无疑问在理论上来讲,理想环境下绝对是可以出结果的。(思路类似于缩小版的 从0硬加到100,我知道各位肯定有高斯解法)

leetcode提交结果:通过20%的测试数据。

lintcode入门级-计算出n阶乘中尾部零的个数_第1张图片

看的到,问题在于在输入的数值变得无比巨大的时候,应该是超出了计算范围,所以导致最后输出是0。

所以我搜索了一下最优解,概括起来就是:要得到尾部0,那就是10 的相乘,10,则是数字对(2,5)的个数,考虑到2的个数必然能满足于5的个数,所以本题考虑 这个阶乘下有多少个因子5就解决问题。有点感受到算法的魅力,当然我不清楚这算不算算法。重写代码如下:

 (function () {
        var trailingZeros = function (n) {
            var t = 0;
            t= parseInt(n/5) +  parseInt(n/25) + parseInt(n/125) + parseInt(n/625) + parseInt(n/3125);
            return t

        };
        console.log(trailingZeros(105));;
    })()
    

结果:

lintcode入门级-计算出n阶乘中尾部零的个数_第2张图片

问题还是同样的问题,我发现这个要通过测试的数据里面的值,真是无比的巨大!

我想通过手动的增加分母,看看是不是因为值太大而溢出,如果我继续增加分母的值,报错但通过率上升的话即可验证。但是我手动没验证出来。。。。看来确实很大,所以我直接当它就是这个问题解决了,最后代码如下,结果通过。

(function () {
        var trailingZeros = function (n) {
            var t = 0;
            for (var i = 5; n > i; i *= 5) {
                t += parseInt(n/i);
            }
            return t
        };
     
    })()

lintcode入门级-计算出n阶乘中尾部零的个数_第3张图片

感觉路还挺远的。。。。加油吧

你可能感兴趣的:(leedcode)