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)

  参考:http://blog.csdn.net/surp2011/article/details/51168272

 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 };

 

 

posted @ 2018-02-04 23:29  jeysin  阅读(112)  评论(0编辑  收藏  举报