标签:
Given an integer n, return the number of trailing zeroes in n!.
Note: Your solution should be in logarithmic time complexity.
Credits:
Special thanks to @ts for adding this problem and creating all test cases.
Subscribe to see which companies asked this question
class Solution { public: int trailingZeroes(int n) { int cnt = 0, j; for (int i = 5; i <= n; i += 5) { int j = i; while (j % 5 == 0) { ++cnt; j /= 5; } } return cnt; } };
这种解法会在N超大时超时Time Limit Exceeded。题目的Note要求我们写出对数时间复杂度的解法。
解法2:在解法1的基础上考虑到能贡献5的数全是5的倍数,而5的指数(5,25,125,...)能贡献5的个数恰好是幂的值(1,2,3,...),非5的指数(10,15,20,30,,...)则只能贡献一个5。而使用N除以5可以得到在[1,N]中有多少个5的倍数,除以25可以得到有多少个25的倍数……这样所有的结果加起来恰好可以算出[1,N]中一共有多少个5。注意25=5*5即可以贡献两个5,而在前面除以5的时候已经计算过一次了,所以加1次就可以了,同理125=5*5*5,在2和25的时候已经考虑到两个5了,所以后面也是再加一个就行了,后面所有5的指数都如此。
class Solution { public: int trailingZeroes(int n) { int cnt = 0; long long k = 5; while(k <= n) { cnt += n / k; k *= 5; } return cnt; } };
注意k必须定义为long long类型以防止在n极大时k会溢出。一个避免这个陷阱的写法如下:
class Solution { public: int trailingZeroes(int n) { int cnt = 0; while(n > 0) { cnt += n / 5; n /= 5; } return cnt; } };
[LeetCode]65. Factorial Trailing Zeros阶乘的尾零个数
标签:
原文地址:http://www.cnblogs.com/aprilcheny/p/4949015.html