LintCode 2.尾部的零

来源:互联网 发布:手机应用隐藏软件 编辑:程序博客网 时间:2024/05/22 14:21

设计一个算法,计算出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;  }


原创粉丝点击