LintCode:尾部的零
设计一个算法,计算出n阶乘中尾部零的个数
样例
11! = 39916800,因此应该返回 2
挑战
O(logN)的时间复杂度
思路:
1、直接计算n!的结果,然后统计0的个数。会溢出
2、考虑到0是由2x5得到的,所以分别统计1..n所有元素中包含的因子2和5的个数,考虑到2的个数一定会大于5的个数,所以只要统计5的个数就好,但是时间复杂度是O(N/5)
3、考虑如5,10,15,20,25,30...等5的倍数,有的产生1个0,有的产生2个0(如25x4),有的产生3个0,如(125x8),故代码如下,时间复杂度为O(logN)
1 class Solution { 2 public: 3 /* 4 * @param n: A long integer 5 * @return: An integer, denote the number of trailing zeros in n! 6 */ 7 long long trailingZeros(long long n) { 8 if(n<=0)return -1; 9 long long sum=n/5; 10 n=n/5; 11 while(n) 12 { 13 sum=sum+n/5; 14 n=n/5; 15 } 16 return sum; 17 } 18 };