📄 组合性质之范德蒙德恒等式的程序实现.txt
字号:
组合性质之范德蒙德恒等式的程序实现[原创]
刚在书上看到一个组合的性质------范德蒙德恒等式,于是就写了个程序来验证一下。恒等式如下:
C(m+n,r)=∑C(m,r-k)*C(n,k),k=0,1,2...r
/*
To prove the property of combo
C(m+n,r)=∑C(m,r-k)*C(n,k),k=0,1,2...r
AUTHOR:BugEyes,http://BugEyes.blog.edu.cn
*/
long jiecheng(int n)
{/* to compute n!=n*(n-1)*(n-2)...*2*1 */
long result=1;
int i;
if(n<0)
{
printf("error to compute \"n!\" because n<0");
exit(-1);
}
for(i=1;i<=n;i++)
result*=i;
return result;
}
long combo(int n,int r)
{ /*to compute C(n,r)*/
return (jiecheng(n)/jiecheng(r)/jiecheng(n-r));
}
long combo1(int n,int r)
{ /*a new method to compute C(n,r)*/
long result=1;
int i;
for(i=n;i>0;i--)
if(i>r&&i>(n-r))
result*=i;
else if(i<=r&&i>(n-r)||i<=(n-r)&&i>r)
;
else if(i<=r&&i<=(n-r))
result/=i;
return result;
}
void main()
{
int m,n,r;
int i;
long result1=0,result2=0;
printf("Please input three digitals m,n,r,and insure r<=m&&r<=n\n");
scanf("%d,%d,%d",&m,&n,&r);
result1=combo1(m+n,r);/*result1=combo(m+n,r)*/
for(i=0;i<=r;i++)
result2+=combo1(m,r-i)*combo1(n,i);/*result2+=combo(m,r-i)*combo(n,i)*/
printf("%ld,%ld",result1,result2);
if(result1==result2)
printf("OK");
else
printf("ERROR");
}
写的仓促,欢迎看过的朋友进行调试,并给出宝贵意见。另外,由于算法本身的限制,m和n的值不能太大。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -