poj2249 Binomial Showdown

链接:http://poj.org/problem?id=2249

题意:就是要求组合数C(n,k)

之前在蓝桥杯上做过一个题,要用到组合数。但是那个做完只过了一半的数据,可能有更大的数据。

一直在想有没有什么非常巧妙的、快速的方法,或者是什么公式求组合数。

没有的。就是按照组合数的定义公式来求解。

不过,程序具体处理过程中,一般的处理都是“边乘边除”,这样既保证数据不会太大,同时也减少了一部分时间。

还有一点就是还得看数据的大小。这个题目long long能过了。如果有更大的数字,任何一种数据类型都无法表示的了。

这时可能就要考虑高精度了。

而我觉得,组合数要用高精度做那可是相当吃力的。既有乘法又有除法。关键是除法好嘛。

一般的数据,估计还是用这样的方法比较好。

 

#include<stdio.h>

long long Combine(int n,int k)
{
	long long ans=1,j=2,i;
    if(k==0)
	  return 1;
    for(i=n;i>=n-k+1;i--)
	{
	   ans*=i;           //边乘边除
	   if(ans%j==0&&j<=k)
	   {
	      ans/=j;
		  j++;
	   }
	}
	return ans;
}

int main()
{
	int n,k;
	while(scanf("%d%d",&n,&k)!=EOF)
	{
	   if(!n&&!k)
		   return 0;
	   if(n-k<k)//公式C(n,k)=C(n,n-k)
		   k=n-k;
	   printf("%ld\n",Combine(n,k));
	}
	return 0;
}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值