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

相关推荐
lhh_qrsly23 分钟前
HTTP / HTTPS / MQTT / MQTTs(嵌入式学习版)
学习·http·https
zyl76513 小时前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
爱读书的小胖17 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌17 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
OPEN-F18 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_3077791318 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
xier_ran18 小时前
【infra之路】AI 编译器学习笔记(十三):AI 编译器全景——TVM、XLA、IREE 与其他
人工智能·笔记·学习
连山齐名18 小时前
ai应用开发的学习笔记
服务器·笔记·学习
tomwang032218 小时前
路径优化建模、优化算法分类及工程化小结
算法·数学建模·分类
小羊没烦恼!18 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp