[容易] 尾部的零

题目来源: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 };
posted @ 2016-04-29 15:00  Pearl_zju  阅读(160)  评论(0编辑  收藏  举报