题目描述:
给定一个整数 n,返回 n! 结果尾数中零的数量。
示例 1:
输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。
示例2:
输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.
代码:
#include<sstream>
class Solution {
public:
int trailingZeroes(int n) {
int sum=0;
while(n!=0){
sum=sum+n/5; //每隔5个数有一个5
n=n/5;
}
return sum;
}
};
用进位方法或大整数相乘方法复杂度太高且占空间太大。题目限定末尾0的个数,只有当阶乘中包含25时才会在末尾出现一个0,所以本质是求25的个数。因为2的个数一定多于5,所以本质是求5的个数。
每隔5个数出现一个5:5、10=25、15=35、20=45、25=55
每隔25个数出现一个5:因为25的因数中多出一个5
同理每隔125个数,出现一个5
同理每隔625个数,出现一个5
…
得到计算公式:sum=n/5+n/25+n/125+n/625+…