Write an algorithm which computes the number of trailing zeros in n factorial.
Example
11! = 39916800, so the out should be 2
这道题不是第一次做了,但是思路总是很凌乱。应该说数学正常的人应该不难做出来,而我有的时候真的是混乱。。
说这道题要求的是阶乘后部0的个数,很自然的想到,是通过因式分解找到2 5 的个数,那么很容易能够考虑到,2的个数是一定比5多的。拿11来说,
1 2 3 4 5 6 7 8 9 10 11, 里边包含的2的个数有: 2(1个),4(2个),6(1个),8(3个);而5的个数只有两个5, 10;
因此问题也转化成了统计5的个数。
11/5 = 2;说明1~11中包含两个五;分别是5, 10(2*5);11/5= 2 2里边就不剩5了,所以最终的结果就是2个。
再拿大一点的数举例:
25:
25/5 = 5;首先,25里边有五个数字里边包含5: 5,10,15,20,25;5/5=1;说明5里边也有一个5;所以全部加起来一共是6个5。所以结果是6个0;注意的是25里可以提供两个5,所以循环的第一次的结果5还可以继续计算,直至结果小于5
代码:
public long trailingZeros(long n) {
// write your code here
//11 11 / 5 = 2
long count = 0;
while(n >5){
count += n/5;
n = n/5;
}
return count;
}