class Solution {
public:
//时间O(n), 空间O(1)
int trailingZeroes(int n) {
int zeroCount = 0;
for (int i = 5; i <= n; i += 5) {
int powerOf5 = 5;
while (i % powerOf5 == 0) {
zeroCount += 1;
powerOf5 *= 5;
}
}
return zeroCount;
}
};
class Solution {
public:
/*
求n!
0的来源 2 * 5 所以一对2和5即可产生一个0,所以0的个数即为min(阶乘中5的个数和2的个数)
又因为是2的倍数的数一定比是5的倍数的数多 所以2的个数一定>=5的个数 所以只需要统计 5 的个数了
例如 5! = 1 * 2 * 3 * 4 * 5
2 2 2 5 一个2和一个5配对出现0 所以5!末尾只有一个零
而在 n = 25 时 可以产生5的有 5 10 15 20 25
即 n/5 = 5个 然鹅 25 = 5*5 所以少算了一个5
n>=25时,故而需要补上它 因此所有可以产生25的也要加上
即为 n/5 + n/25 然鹅 125 = 5*25 所以又少算了一个5
n>=125时,故而需要补上它 因此所有可以产生125的也要加上
即为 n/5 + n/25 + n/125 然鹅 625 = 5*125 所以又少算了一个5
继续补上...
所以最终为 n/5 + n/25 + n/125 + n/625 + ...
即 n/5 + n/5/5 + n/5/5/5 + n/5/5/5/5 + ...
代码如下
*/
//时间O(logn)(以5为底)
int trailingZeroes(int n) {
int five = 0;
while(n >= 5){
five += n/5;
n/=5;
}
return five;
}
};
LeetCode172. 阶乘后的零
最新推荐文章于 2023-12-17 21:52:18 发布