尾部的零
-
问题描述:
设计一个算法,计算出n阶乘中尾部零的个数 -
样例说明:
样例 1:
输入: 11
输出: 2
样例解释:
11! = 39916800, 结尾的0有2个。样例 2:
输入: 5
输出: 1
样例解释:
5! = 120, 结尾的0有1个。
3.代码思路:
根据题目要求,输入的n是一个长整型的数。
我们想要求阶乘尾部零的个数,那么这时我们就需要一个计数器num用来保存我们数到的0的个数
就要知道阶乘的性质
因此我们可以分析出每个数字的阶乘都是从1开始逐次×每次加一的数得到的:
可能到这里有的朋友会想定义一个i,然后++i,相乘的形式来判断;
我们首先考虑是否可行:
如果说我们采用这个形式计算一个数字的阶乘,如果数字小还好说,但是这里的数字是个长整型的,肯定会有测试数据为很大的情况,那么数字自然不能直接计算阶乘再模10来数0的个数,否则就有溢出的风险。
那么再看题目,为什么问的是0呢?0有什么性质吗?
当然我们来考虑一下怎么能得到末尾为0;
当然是除以5,为什么呢?
5!=12345末尾有一个0;
10!=123456789*10末尾有2个0;
同理,我们把n/5,那么就获得了多少个0,但是要注意5的次幂,例如5²,5³等,相当于2个5,3个5.
因此我们需要不断地将n除以5,除以5后如果不能再除5,说明算式中不存在5的次幂。
4.代码:
class Solution {
public:
/*
* @param n: A long integer
* @return: An integer, denote the number of trailing zeros in n!
*/
long long trailingZeros(long long n) {
long long num = 0;
while(n)
{
num += n/5;
n = n/5;
}
return num;
}
};
5.结果