链接: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;
}