题意:
解题思路:
/*
求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 + ...
代码如下:
*/
PHP代码实现:
class Solution {
/**
* @param Integer $n
* @return Integer
*/
// Time: O(log_5(n)), Space: O(1)
function trailingZeroes($n) {
$cnt = 0;
//$n >= 5
while ($n > 0) {
$n = floor($n/5);
$cnt += $n;
}
return $cnt;
}
function trailingZeroes($n) {
if ($n == 0) return 0;
return floor($n / 5) + $this->trailingZeroes($n / 5);
}
}
go代码实现:
func trailingZeroes(n int) int {
res := 0
for n > 0 {//n >= 5
res += n / 5
n /= 5
}
return res
}