设为首页 加入收藏

TOP

Leetcode_Factorial Trailing Zeroes(耗时问题)
2015-07-20 17:19:52 来源: 作者: 【 】 浏览:4
Tags:Leetcode_Factorial Trailing Zeroes 耗时 问题

出现0的情况是,出现5和2的倍数。

[n/k]代表1~n中能被k整除的个数,而能被2整除的个数多余能被5整除的个数,故只要知道能被5整除的个数即可。那么怎样计算n!的质因子中所有5的个数呢?一个简单的方法是计算floor(n/5)。例如,7!有一个5,10!有两个5。除此之外,还有一件事情要考虑。诸如25,125之类的数字有不止一个5。例如,如果我们考虑28!,我们得到一个额外的5,并且0的总数变成了6。处理这个问题也很简单,首先对n÷5,移除所有的单个5,然后÷25,移除额外的5,以此类推。

n!后缀0的个数 = n!质因子中5的个数
= floor(n/5) + floor(n/25) + floor(n/125) + ....

?

class Solution {
	/*
	因此只要计数5的个数就可以了。那么怎样计算n!的质因子中所有5的个数呢?
	一个简单的方法是计算floor(n/5)。例如,7!有一个5,10!有两个5。
	除此之外,还有一件事情要考虑。诸如25,125之类的数字有不止一个5。
	例如,如果我们考虑28!,我们得到一个额外的5,并且0的总数变成了6。
	处理这个问题也很简单,首先对n÷5,移除所有的单个5,然后÷25,移除额外的5,以此类推。
	下面是归纳出的计算后缀0的公式。
	n!后缀0的个数 = n!质因子中5的个数
              = floor(n/5) + floor(n/25) + floor(n/125) + ....
	*/
public:
    int trailingZeroes(int n) {
        int count=0;
		int i=5;
		while(i<=n)
		{
			count+=n/i;
			i*=5;
		}
		return count;
    }
};//Time Limit Exceeded  比如输入2147483647
而另外一种:

?

?

class Solution {
public:
    int trailingZeroes(int n) {
        int ret = 0;
        while(n)
        {
            ret += n/5;
            n /= 5;
        }
        return ret;
    }
};//OK
另种程序的思路是一致的,其中一个,是数据不断增大,当数据很大的时候,会造成耗时很长;另一个是数据不断减小,没有出现类似的问题。


?

?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ 2318 TOYS 叉积应用 下一篇C++ Redis mset 二进制数据接口封..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·【C语言】动态内存管 (2025-12-27 06:23:20)
·C语言中的内存管理 - (2025-12-27 06:23:16)
·C语言指南:C语言内 (2025-12-27 06:23:14)
·Redis on AWS:Elast (2025-12-27 04:19:30)
·在 Spring Boot 项目 (2025-12-27 04:19:27)