【每天学习一点算法 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)

相关推荐
武子康2 小时前
Qwen-Drive 到底是什么:4B 级 VLM 如何成为驾驶策略底座
人工智能·算法·机器学习
坤坤子吖2 小时前
Linux网络编程:TCP服务器的多进程与多线程实现
linux·服务器·开发语言·网络·c++·笔记·学习
zh_xuan3 小时前
LeeCode 496. 下一个更大元素I
数据结构·算法·栈·单调栈
机 _ 长3 小时前
05 智算运维|8 张卡怎么才算「捆成一张」:NCCL 实测与拓扑
运维·人工智能·算法·智算运维
蒸蒸yyyyzwd4 小时前
后端相关学习笔记。
笔记·学习
早起CaiCai4 小时前
【2023-01 OM】利用深度学习算法融合异质观测实现海洋场降尺度
人工智能·深度学习·算法
梦里寻码4 小时前
我用 NestJS + Vue3 写了一套完整的研发管理系统(58 表 / 229 API / 130 项断言,全开源
前端·后端·算法
旖旎夜光4 小时前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习
猿人谷5 小时前
Surrogate Model:让进化算法学会“预测”,为什么它正在成为智能优化的重要技术?
后端·算法·架构