求一个整数的阶乘的尾数0的个数。
**方法一:
**对n!做质因数分解
证明:
对于阶乘而言,也就是
……
随着幂次p的上升,出现
因此左边的加和一定大于右边的加和,也就是
代码:
class Solution {
public:
int trailingZeroes(int n) {
/* //方法一:从1到N中提取5的个数。超时。
int total;
for(int i=1;i<=n;i++)
{
int temp=i;
while(temp%5==0)
{
total++;
temp/=5;
}
}
return total;
}
};
方法二:
从方法一的分析可以知道起作用的只有被5整除的那些数。能不能只对这些数进行计数呢?答案是肯定的。存在这样的规律:
证明:
将
…….
前
最后一段(如果有这个不完整段的话),没有k的倍数(因为它不可能包括
代码:
class Solution {
public:
int trailingZeroes(int n) {
//方法二:[n/k]代表1~n中能被k整除的个数
int total=0;
while(n)
{
total += n/5;
n /= 5;
}
return total;
}
};
参考资料:
1:http://www.cnblogs.com/ganganloveu/p/4193373.html
2:http://zuoye.baidu.com/question/c47f51b87aa60e450fdaec79e53fd91e.html
leetcode172:Factorial Trailing Zeroes
原文地址:http://blog.csdn.net/hjxzb/article/details/44917233