[LeetCode]65. Factorial Trailing Zeros阶乘的尾零个数

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.

Subscribe to see which companies asked this question

解法1:如果N! == K×10M, ( 0 != k%10 ),那么M就是要求的。我们把N!进行质因数分解,则有 N! == 2* 3Y * 5Z……,而10是怎么来的呢,分解之后不就只能由2×5来。也就是说,只要求分解后的min(x, z),又显然,分解之后2的个数显然要比5的个数多。所以,M == Z。根据分析,要计算 Z,最直接的方法,就是计算i(i =1, 2, …, N)的因式分解中5 的指数,然后求和。

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

这种解法会在N超大时超时Time Limit Exceeded。题目的Note要求我们写出对数时间复杂度的解法。

解法2:在解法1的基础上考虑到能贡献5的数全是5的倍数,而5的指数(5,25,125,...)能贡献5的个数恰好是幂的值(1,2,3,...),非5的指数(10,15,20,30,,...)则只能贡献一个5。而使用N除以5可以得到在[1,N]中有多少个5的倍数,除以25可以得到有多少个25的倍数……这样所有的结果加起来恰好可以算出[1,N]中一共有多少个5。注意25=5*5即可以贡献两个5,而在前面除以5的时候已经计算过一次了,所以加1次就可以了,同理125=5*5*5,在2和25的时候已经考虑到两个5了,所以后面也是再加一个就行了,后面所有5的指数都如此。

class Solution {
public:
    int trailingZeroes(int n) {
        int cnt = 0;
        long long k = 5;
        while(k <= n) {
            cnt += n / k;
            k *= 5;
        }
        return cnt;
    }
};

注意k必须定义为long long类型以防止在n极大时k会溢出。一个避免这个陷阱的写法如下:

class Solution {
public:
    int trailingZeroes(int n) {
        int cnt = 0;
        while(n > 0) {
            cnt += n / 5;
            n /= 5;
        }
        return cnt;
    }
};
时间: 2024-10-05 11:18:32

[LeetCode]65. Factorial Trailing Zeros阶乘的尾零个数的相关文章

[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

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] Factorial Trailing Zeros

Well, to compute the number of trailing zeros, we need to first think clear about what will generate a trailing 0? Obviously, a number multiplied by 10 will have a trailing 0 added to it. So we only need to find out how many 10's will appear in the e

[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相乘得来的.如果我们可以计数

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出现的

leetcode: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的个数) 思路:我们可以对n!进行质因数分解有 n!=2x*3y*5z*...,显然尾部0的个数等于min(x,z),并且我们容易知道min(x,z)==z 因为:阶乘就是1*2*3*...*n如果我们

【LeetCode】Factorial Trailing Zeroes (2 solutions)

Factorial Trailing Zeroes 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. 对n!做质因数分解n!=2x*

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!因

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

翻译 给定一个整型n,返回n!后面的零的个数. 注意:你的解决方案应该在log时间复杂度内. 原文 Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in logarithmic time complexity. 分析 起初我看题目的时候没太注意,还以为就是求n这个数后面的零而已,虽然心想不会这么简单吧--就写了一份代码提交了,结果WA提示我5的话应该返回1,