题意是给一个数n,让你求出n的阶乘末尾0的个数,利用质因数分解可以将n的的阶乘看成多个质因数的幂相称的结果,其中,只有2和5相乘才会出现10,增加末尾零,因为2的个数远大于5,所以求末尾0的个数问题就转化为求n!中5的个数。
在n!中,只有5,10,15,20,25,30,35,40,45,50.。。。。这些5的倍数含有5,此为第一层。
在第一层中,25,50,75,,,,这些是5的多次幂,在第一层的基础上多包含了5
在第二层中,125,250,,,,,这些又在第二成的基础上多包含了5
.。。。。
依次递归求下去,可得求解函数。
代码如下
class Solution {
public:
int trailingZeroes(int n) {
int sum = 0;
for (long long i = 5; i <= n; i *= 5) {
sum += n/i;
}
return sum;
}
};
第一次写的代码,,,用的是正着乘上去的思路,但是总是有点误差,而且数还挺大,原来卡了个边界,当n正好为int边界,临近n之下的i的极限乘上5之后会超出int范围,导致误差,把i的类型改为long long 便可以过了。
之后将写法改成边除边加的思路,可以规避这个边界问题。
class Solution {
public:
int trailingZeroes(int n) {
int ans = 0;
while(n){
n /= 5;
ans += n;
}
return ans;
}
};