leetcode 172. 阶乘后的零

问题描述

给定一个整数 n,返回 n! 结果尾数中零的数量。
示例 1:
输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。
示例 2:
输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.
说明: 你算法的时间复杂度应为 O(log n) 。

问题分析

零是由\(2\times5\)产生的,因为如果有5的出现,一定有2与之配对,因此只要考虑\(n!\)中有多少个5就行了。但是这样的复杂度是O(n)的,与题目要求不符,且超出了时间限制。例如 5! = 1 * 2 * 3 * 4 * 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 + ...

代码1(超出时间限制)

class Solution {
public:
    int trailingZeroes(int n) {
        int count=0,i;
        if(n < 5)return 0;
        for(i = 5; i <= n; i++)
        {
            int N = i;
            while(N != 0)
            {
                if(N % 5 == 0)
                {
                    count++;
                    N /= 5;
                }
                else{
                    break;
                }
            }
        }
        return count;
    }
};

代码2

class Solution {
public:
    int trailingZeroes(int n) {
        int count=0;
        while(n != 0)
        {
            count += n/5;
            n /= 5; 
        }
        return count;
    }
};

结果:

执行用时 :4 ms, 在所有 C++ 提交中击败了70.09%的用户
内存消耗 :8.1 MB, 在所有 C++ 提交中击败了64.07%的用户
posted @ 2020-02-15 10:06  曲径通霄  阅读(113)  评论(0编辑  收藏  举报