LeetCode 172. Factorial Trailing Zeroes

题目

Given an integer n, return the number of trailing zeroes in n!.

Example 1:

Input: 3
Output: 0
Explanation: 3! = 6, no trailing zero.

Example 2:

Input: 5
Output: 1
Explanation: 5! = 120, one trailing zero.

Note: Your solution should be in logarithmic time complexity.


这道题其实也是一道数学题,题意是要求一个数字的阶乘中有多少个末尾的0。刚开始只想到了计算5的数量,没想到还有5的n次方会产生多余的0的情况。

由于类似于5*5*4=100这种情况下会比正常的一个0要多出来一个0,而5^3到5^n也会有这种情况,并且用来配对的2的倍数绝对是足够的,而由于在前面计算5的时候已经计算过一个0了,出现n次方的时候只是增加了一个0的份额,所以直接就再加上乘方的数目就可以了。

代码一共有三种实现方法,分别是for循环、while循环和递归。for循环的方法直接在循环条件里计算乘方数,while循环通过不断除5得出结果,递归方法和while循环的本质是一样的,但写起来非常简单易懂!它们的时间复杂度都是O(log_5 N)。

for循环这里注意有一个小坑,就是定义i的时候不能用int,只能用long long,因为在不停地*5,数字可能会变得很大,用int一下就溢出了。代码如下,时间0ms,100%,空间8.4M,49.37%:

/*
 * @lc app=leetcode id=172 lang=cpp
 *
 * [172] Factorial Trailing Zeroes
 */
class Solution {
public:
    int trailingZeroes(int n) {
        int count = 0;
        for (long long i = 5; n / i > 0; i *= 5) {
            count += n / i;
        }
        return count;
    }
};

while循环代码如下,时间4ms,87.11%,空间8.2M,73.76%:

/*
 * @lc app=leetcode id=172 lang=cpp
 *
 * [172] Factorial Trailing Zeroes
 */
class Solution {
public:
    int trailingZeroes(int n) {
        int count = 0;
        while (n) {
            n /= 5;
            count += n;
        }
        return count;
    }
};

递归代码如下,时间4ms,87.11%,空间8.2M,70.05%:

/*
 * @lc app=leetcode id=172 lang=cpp
 *
 * [172] Factorial Trailing Zeroes
 */
class Solution {
public:
    int trailingZeroes(int n) {
        if (n == 0) {
            return 0;
        }
        else {
            return n / 5 + trailingZeroes(n / 5);
        }
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值