题目
给定一个整数 n,返回 n! 结果尾数中零的数量。
示例
- 示例 1:
输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。 - 示例 2:
输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.
说明: 你算法的时间复杂度应为 O(log n) 。
C++代码
注意,题目中要求的是尾数中的0,而不是阶乘得到的结果中所有的0!
末尾出现0的情况:5的倍数乘以一个偶数;
25=10,425=100,8125=1000
425=2525(2个5)
8125=252525 (3个5)
10=25(1个5)
15=35 (1个5)
20=45 (1个5)
25=55 (2个5)
75=355 (2个5)
125=55*5 (3个5)
5!中有1个5的倍数,末尾一共有1个0
10!中有2个5的倍数,末尾一共有2个0
15!中有3个5的倍数,末尾一共有3个0
20!中有4个5的倍数,末尾一共有4个0
25!(15511210043330985984000000) 中有5个5的倍数,1个25的倍数,末尾一共有6个0 (5+1)
50! (30414093201713378043612608166064768844377641568960512000000000000) 中有10个5的倍数,2个25的倍数,末尾一共有12个0 (10+1)
可以归纳推理:n!,n中有x1个5的倍数,x2个25的倍数,x3个125的倍数…,其阶乘末尾的0个数为 x1+x2+x3+…
所以这里的主要问题是求出n!中包含5的倍数的个数、25的倍数的个数…
class Solution {
public:
int trailingZeroes(int n)
{
int count=0;
while(n>1) //计算5、25...倍数的个数(从大到小)
{
n/=5;
count+=n;
}
return count;
}
};