求阶乘末尾零的数量: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
相关产品推荐
相关产品推荐

