You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求阶乘末尾零的数量:JavaScript代码问题排查与优化求助

计算阶乘末尾零的数量:问题分析与优化方案

原代码存在的问题

  • 数值精度丢失:JavaScript的Number类型仅能精确表示2^53 - 1以内的整数。当n ≥ 21时,阶乘结果会超出这个范围,变成科学计数法或丢失末尾的有效数字,导致fact % 10 == 0的判断完全失效。比如计算21!时,实际结果是51090942171709440000,但JavaScript会将其存储为5.109094217170944e+19,此时取模操作无法正确识别末尾的零。
  • 计算效率低下:直接计算完整阶乘会做大量无意义的乘法运算,n越大,计算量的增长速度越快,完全没必要生成整个阶乘结果。

核心优化逻辑

阶乘末尾的零由因数10产生,而10 = 2 × 5。在阶乘的因数分解中,2的数量远多于5,因此只需要统计n!中因数5的总个数,就能得到末尾零的数量。具体统计方式:

  • 先统计n中能被5整除的数的个数(每个贡献1个5)
  • 再统计能被25整除的数的个数(每个额外多贡献1个5)
  • 接着统计能被125整除的数的个数(每个再额外多贡献1个5)
  • 以此类推,直到除数大于n,将所有统计结果相加即可。

优化后的代码

const countTrailingZeros = (n) => {
    let counter = 0;
    let divisor = 5;
    while (divisor <= n) {
        counter += Math.floor(n / divisor);
        divisor *= 5;
    }
    return counter;
};

// 测试用例
console.log(countTrailingZeros(5));  // 输出:1
console.log(countTrailingZeros(10)); // 输出:2
console.log(countTrailingZeros(25)); // 输出:6

内容的提问来源于stack exchange,提问作者Jyotirban Borthakur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:55:12