设计一个算法,计算出n阶乘中尾部零的个数
样例
11! = 39916800,因此应该返回 2
思路:
1 * 2 * 3 * 4 * ......* N中每一个因数分解因子,结果:
1 * 2 * 3 * (2 * 2) * 5 * (2 * 3) *7 * (2 * 2 *2) *......
10进制数结尾每一个0都是因数10存在,对于任何进制都一样,对于一个M进制的数,结果变0就等于乘以M
10可以分解为2 * 5——只有2和5相乘能产生一个10。
分解后整个因式有多少个<2,5>就有多少个0,2个数显然多余5的个数,因此,有多少个5就有多少个<2, 5>。
所以,讨论n阶乘结尾有几个0的问题,就被转换成1到n所有这些数的分解式有多少个5的问题
23!=1×2×3×4×5×6×7×8×9×10×11×12×13×14×15×16×17×18×19×20×21×22×23
对于1到23有多少数字被5整除? 5, 10,15,20。因此23!的尾数零有4个,23/5 = 4
有些数是5^2,5^3,因此要再次除以5得到5平方的因子......
5,10,15,20有一个5的因子
25,50,75有2个5的因子
125等包含了3个5的因子
↓
除以5第一遍得到1个5的因子的数量
第二遍 得到2个5的因子的数量
第三版 得到3个5的因子的数量
相加最后得到尾数为0的数量
105的阶乘,1-105有21个被5整除的数,105/5 =21;
1-21能4个能被5整除的数,21/5 = 4;
public long trailingZeros(long n) {
long count = 0;
while(n >0){
count += (n/5);
n /= 5;
}
return count;
}