微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

确定阶乘函数的尾随零数 (javascript)

如何解决确定阶乘函数的尾随零数 (javascript)

我正在编写一个函数,该函数返回阶乘的尾随零的数量。似乎零的数量从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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。