题意:

image.png

解题思路:

  1. /*
  2. 求n!
  3. 0的来源 2 * 5 所以一对2和5即可产生一个0,所以0的个数即为min(阶乘中5的个数和2的个数)
  4. 又因为是2的倍数的数一定比是5的倍数的数多 所以2的个数一定>=5的个数 所以只需要统计 5 的个数了
  5. 例如 5! = 1 * 2 * 3 * 4 * 5
  6. 2 2 2 5 一个2和一个5配对出现0 所以5!末尾只有一个零
  7. 而在 n = 25 时 可以产生5的有 5 10 15 20 25
  8. 即 n/5 = 5个 然鹅 25 = 5*5 所以少算了一个5
  9. n>=25时,故而需要补上它 因此所有可以产生25的也要加上
  10. 即为 n/5 + n/25 然鹅 125 = 5*25 所以又少算了一个5
  11. n>=125时,故而需要补上它 因此所有可以产生125的也要加上
  12. 即为 n/5 + n/25 + n/125 然鹅 625 = 5*125 所以又少算了一个5
  13. 继续补上...
  14. 所以最终为 n/5 + n/25 + n/125 + n/625 + ...
  15. 即 n/5 + n/5/5 + n/5/5/5 + n/5/5/5/5 + ...
  16. 代码如下:
  17. */

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param Integer $n
  4. * @return Integer
  5. */
  6. // Time: O(log_5(n)), Space: O(1)
  7. function trailingZeroes($n) {
  8. $cnt = 0;
  9. //$n >= 5
  10. while ($n > 0) {
  11. $n = floor($n/5);
  12. $cnt += $n;
  13. }
  14. return $cnt;
  15. }
  16. function trailingZeroes($n) {
  17. if ($n == 0) return 0;
  18. return floor($n / 5) + $this->trailingZeroes($n / 5);
  19. }
  20. }

go代码实现:

  1. func trailingZeroes(n int) int {
  2. res := 0
  3. for n > 0 {//n >= 5
  4. res += n / 5
  5. n /= 5
  6. }
  7. return res
  8. }