HDU 1124 Factorial

解决该题要注意一下几个方面:

1、任何一个自然数都可分解质因数。N!=1*2*3*4*5*6*...*N=2^a*3^b*5^c*7^d......=(2*5)^c*2^(a-c)*3^b*7^d......=10^c*2^(a-c)*3^b*7^d......

2、两数相乘产生0,只会是2和5相乘。又由于在分解质因数时小的质数的幂次一定不小于大的质数的幂次大,所以a>=c。故解决该题转化成找出N!中5的幂次。

3、如何找出5的幂次呢?举例说明:N=26,阶乘中包含因数5、10、15、20、25,可知5的幂次为6。5=5*1,10=5*2,15=5*5,20=5*4,25=5*5,求解时用26/5=5,

再用5/5=1,再用1/5=0,所以总幂次为5+1+0=6。为什么可以这样求?在N!中数是连续增加的,5也是以其倍数渐进增加,一直增加到不大于N且是5的整数倍的最大整数。

这样一来就可以用N/5来确定出现多少个5了。当然,这还不够。比如26/5=5,与其幂次为6不符!原因在于25=5*5,其中含有2个5!所以,又有了紧接着的5/5=1,1/5=0了。

(最后这点解释的不够清楚,具体见代码,读者如有好的解释,也欢迎讨论!)

 

AC代码:52MS,输入输出用cin、cout就TLE了!

#include<iostream>
using namespace std;

int main()
{
	int t;

	scanf("%d",&t);
	while(t--)
	{
		int n,tmp=0;

		scanf("%d",&n);
		while(n)
		{
			tmp+=n/5;
			n/=5;
		}

		printf("%d\n",tmp);
	}

	return 0;
}


 

 

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值