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