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%的测试数据。
看的到,问题在于在输入的数值变得无比巨大的时候,应该是超出了计算范围,所以导致最后输出是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));;
})()
结果:
问题还是同样的问题,我发现这个要通过测试的数据里面的值,真是无比的巨大!
我想通过手动的增加分母,看看是不是因为值太大而溢出,如果我继续增加分母的值,报错但通过率上升的话即可验证。但是我手动没验证出来。。。。看来确实很大,所以我直接当它就是这个问题解决了,最后代码如下,结果通过。
(function () {
var trailingZeros = function (n) {
var t = 0;
for (var i = 5; n > i; i *= 5) {
t += parseInt(n/i);
}
return t
};
})()
感觉路还挺远的。。。。加油吧
上一篇: 结构化数据、半结构化数据和非结构化数据
下一篇: Lintcode Python之移动零