【每天学习一点算法 2026/04/08】阶乘后的零

每天学习一点算法 2026/04/08

题目:阶乘后的零

给定一个整数 n ,返回 n! 结果中尾随零的数量。

提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1

我们先来分析一下,什么情况下有阶乘结果末尾会有 0 , 因为 2 * 5 = 10,所以这道题就可以转换成求阶乘中有多少个 2 * 5

我们这里想到最简单的办法就是统计所有数字的 2 和 5 的因数的个数,然后取较小的一个

再有我们其实可以知道每个五的倍数和它相邻五的倍数之间至少有两个偶数,所以因数 5 的个数一定是小于 2 的个数的,所以我们可以直接统计因数 5 的个数返回

typescript 复制代码
function trailingZeroes(n: number): number {
  if (n < 5) return 0
  let count5 = 0
  for (let i = 5; i <= n; i++) {
    if (i % 5 !== 0) {
      continue
    }
    let current = i
    while (current % 5 === 0) {
      count5++
      current /= 5
    }
  }
  return count5
};

那么我们可以设计并实现对数时间复杂度的算法来解决此问题吗?

其实上面的问题就转变成了,小于 n 的 5 的倍数中因数 5 的个数

  • 我先计算一下 5 的倍数就应该是: m = Math.floor(n / 5)
  • 我们注意到每出现第五次 5 的倍数就会出现一个 包含因数 5 的 5 的倍数:o = Math.floor(m / 5)
  • ...

我们其实这个过程就是:先找 5 的 1 次幂的个数,再找 5 的 2 次幂的个数,直到找 5 的 i 次幂的个数(5 的 i + 1 次幂 大于 n)

我们将这写数累加起来就是我们要找的因数 5 的个数

typescript 复制代码
function trailingZeroes(n: number): number {
  let sum = 0
  while (n >= 5 && n !== 0) {
    n = Math.floor(n / 5)
    sum += n
  }
  return sum
};

题目来源:力扣(LeetCode)

相关推荐
Mr_Xuhhh2 小时前
算法刷题笔记:从滑动窗口到哈夫曼编码,我的算法进阶之路
开发语言·算法
MicroTech20252 小时前
突破虚时演化非酉限制:MLGO微算法科技发布可在现有量子计算机运行的变分量子模拟技术
科技·算法·量子计算
唐樽2 小时前
C++ 竞赛学习路线笔记
c++·笔记·学习
hssfscv2 小时前
软件设计师下午题六——Java的各种设计模式
java·算法·设计模式
珂朵莉MM2 小时前
第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第3赛季优化题--多策略混合算法
人工智能·算法
罗西的思考2 小时前
【OpenClaw】通过 Nanobot 源码学习架构---(6)Skills
人工智能·深度学习·算法
枫叶林FYL2 小时前
【自然语言处理 NLP】7.2 红队测试与对抗鲁棒性(Red Teaming & Adversarial Robustness)
人工智能·算法·机器学习
qiqsevenqiqiqiqi2 小时前
字符串模板
算法
sensen_kiss2 小时前
CAN302 Technologies for E-Commerce 电子商务技术 Pt.6 市场营销与SEO(搜索引擎优化)
android·学习·搜索引擎