欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-24 17:37:08
...

题目地址: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阶乘中尾部零的个数

看的到,问题在于在输入的数值变得无比巨大的时候,应该是超出了计算范围,所以导致最后输出是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阶乘中尾部零的个数

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

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

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

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

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