如何不计算阶乘直接求解大数阶乘的末尾零个数(Java)
不计算阶乘统计末尾零的个数
你贴的这段代码根本处理不了大数字的情况——当n稍微大一点,long类型直接就溢出了,连正确的阶乘结果都存不住,更别说统计末尾零了。
要不用计算阶乘的方式统计末尾零,核心逻辑很简单:
- 阶乘末尾的零全来自因数中的
10,而10 = 2 × 5 - 在阶乘的所有因数里,
2的数量远多于5,所以只需要统计n!中包含多少个因数5,就是末尾零的总数
具体的计算方法是:不断用n除以5,把每次的商累加起来,直到商为0为止。比如计算25!的末尾零:
- 25 ÷ 5 = 5,5 ÷ 5 = 1,1 ÷ 5 = 0
- 总和是5 + 1 = 6,所以25!末尾有6个零
对应的代码可以写成这样:
public int countTrailingZeros(int n) { int count = 0; while (n >= 5) { n /= 5; count += n; } return count; }
这段代码的逻辑很直白:每次把n缩小为原来的1/5(取整),累加的结果就是所有能分解出5的因数的总个数,也就是末尾零的数量。不管n多大,都能快速算出结果,完全不会有溢出问题。
内容的提问来源于stack exchange,提问作者Noah Solomon
相关产品推荐
相关产品推荐

