Factorial Trailing Zeroes(析因,求尾随个0个数)

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

  这是LeetCode Online Judge上的一个原题:给定一个n,求n!中,末尾0的个数。

  • 思路
    1. n!中0的个数,可以将n!表示成 n!=m*10k,其中k就是题目要求的结果。那么,10k是怎么来的呢?很容易想到,10=2*5,那么,10k=(2*5)k;至此,可以简化成,题目求的是2*5的个数
    2. 进一步思考,1*2*3……(n-1)*n,求2*5的个数就是求1-n中2和5的因子总数分别总共有多少个,并且2*5的个数是由min(2个数,5个数)决定的。(1,2,3,4,5……n)每2个数中即最起码有有一个2的因子;而5出现的次数为:每5个中才出现一次5的因子,因此,可以判断,因子5出现的次数远小于因子2。所以此题简化成:求1-n中因子5的个数的总和;

     当到这是,很愉快地解决了为题,洋洋洒洒写到以下代码:

class Solution {
public:
    int trailingZeroes(int n) {

        int count5 = 0;
        for(int i=1 ; i<=n ; i++)
        {
            int temp = i;
             while (temp%5 == 0)
            {
                ++count5;
                temp /= 5;
            }
        }

        return count5;
    }
};

    在LeetCode上一提交,呀,报错了!!!超时了,Last executed input:1808548329。

    这时候一百度,看到博客园上有人有更简单的方法啦:http://www.cnblogs.com/ganganloveu/p/4193373.html。仔细一看,很有道理呀,但是有点看不懂,再百度一下,好了,问题全解决了,正确的思路应该继续往下想:

    3. 1-n中,只有5的倍数,才含有因子5。1-5,6-10,11-15,16-20,21-25……可以看出,1-n中有n/5个数字是5的倍数;但25的倍数的数字至少应该有2个含5的因子(25=5*5);以此类推,125的倍数的数字至少含有3个5的因子……顾而程序可以修改为:

class Solution {
public:
    int trailingZeroes(int n) {

        int count5 = 0;
        while(n)
        {
            count5 += n/5;
            n /= 5;
        }

        return count5;
    }
};

    完美解决!!!

    所以,这题留给我们的思考是,看到代码不要直接提笔就写,要多想,多思考,多推算,有很多方法值得借鉴!!!!

    

时间: 2024-10-11 01:20:02

Factorial Trailing Zeroes(析因,求尾随个0个数)的相关文章

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

【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*

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

[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. Credits:Special thanks to @ts for adding this problem and creating all test cases. 这道题并没有什么难度,是让求一个数的阶乘末尾0的个数,也就是要找乘数中10的个数,

172. Factorial Trailing Zeroes -- 求n的阶乘末尾有几个0

Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in logarithmic time complexity. (1) class Solution { public: int trailingZeroes(int n) { int ans = 0; for(long long i = 5; n / i; i *= 5) { ans += n / i; }

137.Factorial Trailing Zeroes

题目: Given an integer n, return the number of trailing zeroes in n!. 给定一个整数n,返回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 s