问题描述
我正在编写一个函数,该函数返回阶乘的尾随零的数量。似乎零的数量从0增加了!每 5 个正增量,但每 25 个增量也增加 1 个零。问题是当我传入一个像 1000 这样的数字时,它应该返回 249,但它返回 240。我错过了什么吗?
我几乎肯定有更好的方法来写这个,但希望有人能告诉我我当前的函数中缺少什么?
function zeros(n) {
const extraZeros = n/25
const zeros = n/5
if(extraZeros >= 1) {
return zeros + Math.floor(extraZeros)
}else{
return Math.floor(zeros)
}
}
console.log(zeros(0),0);
console.log(zeros(5),1);
console.log(zeros(6),1);
console.log(zeros(30),7);
console.log(zeros(60),14);
console.log(zeros(1000),249); // missing 9 zeros?
任何帮助将不胜感激,谢谢!
解决方法
似乎零的数量是从0开始增加的!每 5 个正增量增加 1 个零,每 25 个增量增加 1 个零。
你说得对,但请再读一遍这句话。你看到图案了吗?
它还会每 125 和 625 增量增加一个零,等等。您需要根据 5 的幂进行概括。
const zeros = (n) => {
let power = 1;
let totalZeros = 0;
while (n > 5 ** power) {
totalZeros += Math.floor(n / (5 ** power));
power++;
}
return totalZeros;
};
console.log(zeros(0),0);
console.log(zeros(5),1);
console.log(zeros(6),1);
console.log(zeros(30),7);
console.log(zeros(60),14);
console.log(zeros(1000),249);
另一种写作方式,来自 Patrick Roberts:
const zeros = (n) => {
let totalZeros = 0;
for (let power = 5; power < n; power *= 5) {
totalZeros += Math.floor(n / power);
}
return totalZeros;
};
console.log(zeros(0),249);