[容易] 尾部的零
题目来源:http://www.lintcode.com/zh-cn/problem/trailing-zeros/
首先,算出n的阶乘的结果再去计算末尾有多少个0这种方法是不可取的, 因为n的阶乘是一个非常大的数,分分钟溢出。
应当分析是什么使n的阶乘结果末尾出现0?n阶乘末尾的0来自因子5和2相乘,5*2=10。因此,我们只需要计算n的阶乘里, 有多少对5和2。注意到2出现的频率比5多,因此,只需要计算有多少个因子5即可。
有两种情况:
1、只需要计算5的因子有几个,比如20/5=4,20,15,10,5这几个数有因子5。所以20!的末尾就有4个0。
2、除与5之后的部分还有因子5,比如25,25/5=5,25,20,15,10,5这几个数有因子5。但是25分解成5和5,有2个因子5。所以25!的末尾就有6个0。
所以采用不断循环除与5的方法,直至没有因子5。
其实就是寻找1~n中,有因子5的数的个数。比如n=30,1~30中,有因子5的数有5,10,15,20,25,30,再加上25可以分解成5*5,所以30!的尾部有7个0。即30/5+6/5=7。
1 class Solution {
2 public:
3 // param n : description of n
4 // return: description of return
5 long long trailingZeros(long long n) {
6 long long sum = 0;
7 while (n != 0) {
8 sum += n / 5;
9 n /= 5;
10 }
11 return sum;
12 }
13 };
-------------------------------------------------
原创博客 转载请注明出处http://www.cnblogs.com/hslzju
-------------------------------------------------