结合重复,计算差异

时间:2011-11-06 07:34:09

标签: c++ math combinations

我有一个小程序。我必须计算重复的组合 我的代码:

int factorial(int a){

    if (a<0)
    return 0;
    if (a==0 || a==1)
    return 1;
    return factorial(a-1)*a;
}
long int combinationWithRepetion(int n, int k){
    long int a,b,wyn=0;

    wyn=factorial(n+(k-1))/(factorial(k)*factorial(n-1));

    return wyn;
}
int main()
{
    int k,n=0;
    cout<<"Give n: ";
    cin>>n;
    cout<<"Give k: ";
    cin>>k;
    cout<<"combination With Repetion for n="<<n<<
    " k="<<k<<".\n Is equal to "<<combinationWithRepetion(n,k)<<endl;
    return 0;
}

对于Wolfram alfa中的n = 9和k = 6,我得到3003,但在此程序中结果是44。

对我来说,代码很好。

2 个答案:

答案 0 :(得分:4)

使用n=9k=6计算factorial(14) 87,178,291,200,它将溢出4字节int。如果要使用此公式,则需要使用long long之类的内容来获取8字节int

有更好的计算二项式系数的公式,它们不依赖于计算全因子然后进行除法。请参阅Binomial coefficient in programming languages,直接方法(而不是使用递归)。

在C ++中,您可以使用:

int binomial(int N, int K) {
  if( K > N - K )
    K = N - K;
  int c = 1;
  for(int i = 0; i < K; ++i) {
    c *= (N - i);
    c /= (i + 1);
  }
  return c;
}

答案 1 :(得分:0)

所以你在计算(n + k-1)选择k。在n = 9,k = 6的情况下,它是14chose6(= 3003)。但是14!需要超过36位来表示,但你的int只有32位。更好的实现方式是简化n!/((nk)! k!)到n (n-1) ... (n-k + 1)/ ķ!或者你可以使用pascal三角形。