题目:
Given an integer n, return the number of trailing zeroes in n!.
Example 1:
Input: 3 Output: 0 Explanation: 3! = 6, no trailing zero.
Example 2:
Input: 5 Output: 1 Explanation: 5! = 120, one trailing zero.
Note: Your solution should be in logarithmic time complexity.
这道题其实也是一道数学题,题意是要求一个数字的阶乘中有多少个末尾的0。刚开始只想到了计算5的数量,没想到还有5的n次方会产生多余的0的情况。
由于类似于5*5*4=100这种情况下会比正常的一个0要多出来一个0,而5^3到5^n也会有这种情况,并且用来配对的2的倍数绝对是足够的,而由于在前面计算5的时候已经计算过一个0了,出现n次方的时候只是增加了一个0的份额,所以直接就再加上乘方的数目就可以了。
代码一共有三种实现方法,分别是for循环、while循环和递归。for循环的方法直接在循环条件里计算乘方数,while循环通过不断除5得出结果,递归方法和while循环的本质是一样的,但写起来非常简单易懂!它们的时间复杂度都是O(log_5 N)。
for循环这里注意有一个小坑,就是定义i的时候不能用int,只能用long long,因为在不停地*5,数字可能会变得很大,用int一下就溢出了。代码如下,时间0ms,100%,空间8.4M,49.37%:
/*
* @lc app=leetcode id=172 lang=cpp
*
* [172] Factorial Trailing Zeroes
*/
class Solution {
public:
int trailingZeroes(int n) {
int count = 0;
for (long long i = 5; n / i > 0; i *= 5) {
count += n / i;
}
return count;
}
};
while循环代码如下,时间4ms,87.11%,空间8.2M,73.76%:
/*
* @lc app=leetcode id=172 lang=cpp
*
* [172] Factorial Trailing Zeroes
*/
class Solution {
public:
int trailingZeroes(int n) {
int count = 0;
while (n) {
n /= 5;
count += n;
}
return count;
}
};
递归代码如下,时间4ms,87.11%,空间8.2M,70.05%:
/*
* @lc app=leetcode id=172 lang=cpp
*
* [172] Factorial Trailing Zeroes
*/
class Solution {
public:
int trailingZeroes(int n) {
if (n == 0) {
return 0;
}
else {
return n / 5 + trailingZeroes(n / 5);
}
}
};