我有一个小程序。我必须计算重复的组合 我的代码:
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。
对我来说,代码很好。
答案 0 :(得分:4)
使用n=9
和k=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三角形。