Factorial Trailing Zeroes 阶乘尾零

题目:Given an integer n, return the number of trailing zeroes in n!.(Leetcode 172)

C++参考框架:

class Solution {
public:
    int trailingZeroes(int n) {
    //code
    }
};

1.直接的想法是计算n!后求尾部0的数量,然而随着n增加,n!增长很快,数据存储很成问题,而且时间复杂度为O(n),不能满意,代码也不放了。

2.idea:要计算尾部0的个数,即是计算n!因数中10的个数,即10=2×5的个数。

观察关于关于2和5的因数分解:

1
2
3
4=2×2
5
6=2×3
7
8=2×2×2
9
10=2×5
11
12=2×2×3
13
14=2×7
15=3×5
16=2×2×2×2
.
.
.

只要是偶数就至少包含一个因数2,个位为0或5的则包含因数5,直观上可以看到1到n所有的分解中因数2比因数5多(我没有严格证明),则问题转化为寻找n!中因数5的个数。n!因式分解中有几个5则尾部就有几个0。

代码如下:

class Solution {
public:
    int trailingZeroes(int n) {
        int num_of_five=0,t;
        for(int i=5;i<=n;i+=5)
        {
            t=i;
            while(t%5==0)
            {
                ++num_of_five;
                t/=5;
            }
        }
        return num_of_five;
    }
};

这样就不用计算n!,但是时间复杂度是O((n/5)log5(n/5))=O(nlogn),在n较大时计算时间不能满意。

3.假设现在n=133。

我们只要计算5的数量,则只关注包含因数5的数字,即,5,10,15,20,25,30,...,130共26个数字。

这些数字包含因数5的数量分别为:
1,1,1,1,2,1,1,1,1,2,1,1,1,1,2,1,1,1,1,2,1,1,1,1,3,1。即

1,1,1,1,(2=1+1),1,1,1,1,(2=1+1),1,1,1,1,(2=1+1),1,1,1,1,(2=1+1),1,1,1,1,(3=1+1+1),1这样一个数列。问题转化为计算有此规律的数列的和,代码如下:

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

时间复杂度为O(logn)。

时间: 2024-11-10 00:18:48

Factorial Trailing Zeroes 阶乘尾零的相关文章

LeetCode Factorial Trailing Zeroes (阶乘后缀零)

题意:如标题 思路:其他文章已经写过,参考其他. 1 class Solution { 2 public: 3 int trailingZeroes(int n) { 4 return n/5<5? n/5: n/5+trailingZeroes(n/5); 5 } 6 }; AC代码

[LeetCode] Factorial Trailing Zeroes 阶乘末尾0

Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in logarithmic time complexity. Credits:Special thanks to @ts for adding this problem and creating all test cases. Hide Tags Math 这题应该是2014年年底修改该过测试样本,之前的通过

172 Factorial Trailing Zeroes 阶乘后的零

给定一个整数 n,返回 n! 结果尾数中零的数量.注意: 你的解决方案应为对数时间复杂度. 详见:https://leetcode.com/problems/factorial-trailing-zeroes/description/ class Solution { public: int trailingZeroes(int n) { int res=0; while(n) { n/=5; res+=n; } return res; } }; 参考:https://www.cnblogs.c

[LeetCode]172. Factorial Trailing Zeroes阶乘尾随0的个数

所有的0都是有2和45相乘得'到的,而在1-n中,2的个数是比5多的,所以找5的个数就行 但是不要忘了25中包含两个5,125中包含3个5,以此类推 所以在找完1-n中先找5,再找25,再找125....直到n/5商为0 return n==0?0:n/5+trailingZeroes(n/5); 原文地址:https://www.cnblogs.com/stAr-1/p/8477839.html

LeetCode 172. 阶乘后的零(Factorial Trailing Zeroes)

172. 阶乘后的零 LeetCode172. Factorial Trailing Zeroes 题目描述 给定一个整数 n,返回 n! 结果尾数中零的数量. 示例 1: 输入: 3 输出: 0 解释: 3! = 6, 尾数中没有零. 示例 2: 输入: 5 输出: 1 解释: 5! = 120, 尾数中有 1 个零. 说明: 你算法的时间复杂度应为 O(log n) . Java 实现 class Solution { // 递归思路 public static int trailingZe

LeetCode172 Factorial Trailing Zeroes. LeetCode258 Add Digits. LeetCode268 Missing Number

数学题 172. Factorial Trailing Zeroes Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in logarithmic time complexity. (Easy) 分析:求n的阶乘中末位0的个数,也就是求n!中因数5的个数(2比5多),简单思路是遍历一遍,对于每个数,以此除以5求其因数5的个数,但会超时. 考虑到一个数n比他小

[LeetCode]172.Factorial Trailing Zeroes

题目 Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in logarithmic time complexity. 分析 朴素解法: 首先求出n!,然后计算末尾0的个数.(重复÷10,直到余数非0) 该解法在输入的数字稍大时就会导致阶乘得数溢出,不足取. O(logn)解法: 考虑n!的质数因子. 后缀0总是由质因子2和质因子5相乘得来的.如果我们可以计数

Factorial Trailing Zeroes

Factorial Trailing Zeroes Total Accepted: 44612 Total Submissions: 144778 Difficulty: Easy Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in logarithmic time complexity. (M) Number of Digit One n!的结果中0的个

LeetCode Day4——Factorial Trailing Zeroes

1 /* 2 * Problem 172: Factorial Trailing Zeroes 3 * Given an integer n, return the number of trailing zeroes in n!. 4 * Note: Your solution should be in logarithmic time complexity. 5 */ 6 7 /* 8 * Solution 1 9 * 对于每一个数字,累计计算因子10.5.2数字出现的个数,结果等于10出现的