2015年7月9日
Leetcode:Factorial Trailing Zeroes
Given an integer n, return the num er of trailing zeroes in n!
Note: Your solution should be in logarithmic time complexity.
题目大意:
给一个n,求出n!末尾有几个0。
如果我没记错的话这是微软的一个笔试题目。
n!=1∗2∗.....∗n
如果
n!=K∗10M
,K不能被10除尽,则末尾有M个0。分析什么情况下怎么会在末尾产生0:
由于 10=2∗5 ,取 [1,n] 的任意两个数a,b,这两个数相乘要产生0,a跟b的所有因子中至少有一个5和一个2,这样才能在末尾产生0。1个5跟1个2就会产生一个0,x个5跟x个2就会产生x个0。
所以综上所述:需要统计n!中的因子5的个数num1,因子2的个数num2,则答案就是:
min(num1,num2)
这样迈出了一大步了,不难看出n!中因子5的个数远远小于2的个数,所以只需统计因子5的个数了。
所以得到如下程序:
class Solution {
public:
int trailingZeroes(int n) {
long long cnt = 0;
for(int i = 1; i <= n; ++i){
int num = i;
while(num % 5 == 0){
cnt++;
num /= 5;
}
}
return cnt;
}
};
时间复杂度
O(n)
,很明显这样是会超时的。
再来看看能否继续迈出一大步。
公式:
Z=[n/5]+[n/52]+[n/53]+.……
[n/5] 表示不大于n的数中5的倍数贡献一个5, [n/x] 表示不大于n的数中x( x=5y )的倍数贡献 [n/x] 个5,所以可得到如下代码:
class Solution {
public:
int trailingZeroes(int n) {
long long cnt = 0;
while(n){
cnt += n / 5;
n /= 5;
}
return cnt;
}
};
时间复杂度
O(log5n)
,Accepted。
转载请注明出处:blog.csdn.net/Royecode/article/details/46822913