Leetcode 172.阶乘后的零
题目描述
给定一个整数 n,返回 n! 结果尾数中零的数量。
示例 1:
输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。
示例 2:
输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.
说明: 你算法的时间复杂度应为 O(log n) 。
解题思路
题目要求算的是阶乘过后的数中零的数量,
-
阶乘的增长速度很快,如果阶乘到int型的最大范围,那将会是一个很大很大的数,所以通过先求结果,在求数字中的零的个数是行不通的
-
要求结果中零的个数,其实是由2和5相乘得到的,我们只需要统计2和5的个数,然后去最小的那个数,就是零出现的个数;这里没有数学证明,只是稍微口述一下,2是每隔两个数都会出现一次,而5是每隔五个数出现一次,所以就可以直接变成统计5出现的次数,可以写出下面代码:
class Solution { public: int trailingZeroes(int n) { int numOfZeros = 0; while(n>0){ numOfZeros += numOf5(n) ; n--; } return numOfZeros; } int numOf5(int num){ int count = 0; while((num > 1) && (num%5 == 0)){ count ++; num /= 5; } return count; } };
虽然是做了优化,但是提交的时候还是==超时==了
-
求n! 参考链接
0的来源 2 * 5 所以一对2和5即可产生一个0,所以0的个数即为min(阶乘中5的个数和2的个数)
又因为是2的倍数的数一定比是5的倍数的数多 所以2的个数一定>=5的个数 所以只需要统计 5 的个数了
例如 5! = 1 * 2 * 3 * 4 * 5
一个2和一个5配对出现0 所以5!末尾只有一个零
而在 n = 25 时 可以产生5的有 5 10 15 20 25
即 n/5 = 5个 然鹅 25 = 55 所以少算了一个5
n>=25时,故而需要补上 因此所有可以产生25的也要加上
即为 n/5 + n/25 然鹅 625 = 2525 所以又少算了一个25
继续补上…
所以最终为 n/5 + n/25 + n/625 +…
即 n/5 + n/5/5 + n/5/5/5 + …
代码如下:
class Solution {
public:
int trailingZeroes(int n) {
int numOfZeros = 0;
while(n){
numOfZeros += n/5;
n /= 5;
}
return numOfZeros;
}
};
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步