关闭

Leetcode Factorial Trailing Zeroes

标签: LeetcodeFactorial
441人阅读 评论(0) 收藏 举报
分类:

2015年7月9日
Leetcode:Factorial Trailing Zeroes
Given an integer n, return the num er of trailing zeroes in n!

Note: Your solution should be in logarithmic time complexity.

题目大意:
给一个n,求出n!末尾有几个0。

如果我没记错的话这是微软的一个笔试题目。

n!=12.....n
如果n!=K10M,K不能被10除尽,则末尾有M个0。分析什么情况下怎么会在末尾产生0:
由于10=25,取[1,n]的任意两个数a,b,这两个数相乘要产生0,a跟b的所有因子中至少有一个5和一个2,这样才能在末尾产生0。1个5跟1个2就会产生一个0,x个5跟x个2就会产生x个0。
所以综上所述:需要统计n!中的因子5的个数num1,因子2的个数num2,则答案就是:
min(num1,num2)

这样迈出了一大步了,不难看出n!中因子5的个数远远小于2的个数,所以只需统计因子5的个数了。
所以得到如下程序:

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

时间复杂度On,很明显这样是会超时的。
再来看看能否继续迈出一大步。
公式:

Z=[n/5]+[n/52]+[n/53]+.

[n/5]表示不大于n的数中5的倍数贡献一个5,[n/x]表示不大于n的数中x(x=5y)的倍数贡献[n/x]个5,所以可得到如下代码:

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

时间复杂度Olog5n,Accepted。
转载请注明出处:blog.csdn.net/Royecode/article/details/46822913

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:19849次
    • 积分:438
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:2篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论