您的位置:首页 > 编程语言 > Java开发

LintCode 2.尾部的零

2017-09-06 15:31 316 查看
设计一个算法,计算出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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LintCode Java 数学