给定一个整数 n,返回 n! 结果尾数中零的数量。
示例 1:
输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。
示例 2:
输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.
分析:
1.先求阶乘,得到的数除以10,每整除一次count++;最后输出count;但这个方法不怎么行,因为阶乘很容易就溢出了
2.末尾有多少个0,说明他可以拆解成一个数跟多少个10相乘,
那么我们只需要计算它的因子里面有多少个10,
10的因子是1和10或者2和5,1和10就相当于1×2×5。
2的倍数比5的倍数的个数要多得多,所以只要能找到5,一定能找到一个2,
所以我们只需要判断每个累乘的数里有多少个因子5,总的因子5的个数就是结尾为0的个数;
试一下:
class Solution {
public int trailingZeroes(int n) {
int count=0;
for(int i=1;i<=n;i++)
{
if(i%5==0)
{
count++;
int shang=i/5;
while(shang%5==0)
{
count++;
shang=shang/5;
}
}
}
return count;
}
}
结果超时了
再分析:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15…20…25…30…50…75…100…125…
每5个数出现1个因子5;
那直接n/5不就好?
但是,25=5x5;出现两个5;
50=25x2,也就是25的倍数也会出现多个5;
所以,把n缩小5倍,n=n/5;
class Solution {
public int trailingZeroes(int n)
{
int count=0;
do{
count+=n/5;
n=n/5;
}while(n>0);
return count;
}
}
ok了
参考网址https://leetcode-cn.com/problems/factorial-trailing-zeroes/solution/xiang-xi-tong-su-de-si-lu-fen-xi-by-windliang-3/