Java 计算N阶乘末尾0的个数-LeetCode 172 Factorial Trailing Zeroes

题目

Given an integer n, return the number of trailing zeroes in n!.

Note: Your solution should be in logarithmic time complexity.

分析

Note中提示让用对数的时间复杂度求解,那么如果粗暴的算出N的阶乘然后看末尾0的个数是不可能的。

所以仔细分析,N! = 1 * 2 * 3 * ... * N 而末尾0的个数只与这些乘数中5和2的个数有关,因为每出现一对5和2就会产生一个10那么N!末尾一定会有一个0。然而进一步分析会发现,因子中2的个数肯定是大于5的个数,所以我们只要找出N!中因子5的总个数即可。

1.给定N那么N/5会得到所有5*1, 5*2, 5*3......的个数

2.N/25会得到所有25*1, 25*2, 25*3.....的个数

3.N/125会得到所有125*1, 125*2, 125*3.......的个数

........

可能会有疑问,25中有两个5,125中有3个5会不会少算,但是仔细观察会发现,在第1步中已经对25的情况算了一次,第2步相当于把另一个5统计进来,以此类推

代码

1     public int trailingZeroes(int n) {
2         int rs = 0;
3         while (n != 0) {
4             rs += (n / 5);
5             n /= 5;
6         }
7         return rs;
8     }

这样就得出了结果

 

posted @ 2015-05-11 11:19  xlturing  阅读(664)  评论(0编辑  收藏  举报