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;
样例
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 尾部的0
- LintCode 2 : 尾部的零(java实现)
- LintCode 尾部的零
- lintcode 2:尾部的零
- lintcode 求n!尾部的零的数目
- LintCode 2.尾部的零 C++
- 【LintCode】2、尾部的零
- LintCode Java——尾部的零
- lintcode 2:尾部的零
- LintCode_尾部的零
- LintCode 2 尾部的零
- [Lintcode] #2 尾部的零
- LintCode【简单】2. 尾部的零 。代码及思路
- 【计算连乘积中末尾0的个数】LintCode 尾部的零
- Lintcode 2. 尾部的零
- LintCode 2.尾部的零
- lintcode-2-尾部的零
- LintCode Python 尾部的零
- Lintcode 尾部零的个数
- (lintcode)第2题尾部的零