展开全部
【解题思路】
组合的计算公式是:A取B的组合=A!/(B!*(A-B)!),但是编程计算组合要注意一个问题,就是阶乘的得数是比较大的,容易产生溢出,导致结果错误,所以要尽量简化公式。那么从上面的公式中可以得出两个结论:
一是A取B的组合= A!/(B!*(A-B)!),而A取(A-B)的组合也是= A!/(B!*(A-B)!),无非就是把份母的两个因子换个位置而已。直观的讲就是5取3的组合等于5取2的组合;10取8的组合等于10取2的组合,所以计算10取8的组合时,可以简化成10取2的组合,这样会大大减少计算量。
二是可以把A!的后面部分约掉,比如5取2的组合=5*4*3*2*1/((2*1)*(3*2*1),事实上就是等于5*4/2*1,也就是说其实不需要把A进行阶乘,而只需要从A往下乘B次,再除以B的阶乘就可以了,这样也可以减少很多运算量,大大减少溢出范围。比如10取3组合,只需要等于10*9*8(乘3个就可以)÷3*2*1(3的阶乘)。根据这个思路,具体代码如下:
【程序代码】
int C(int n,int m) //求n取m组合的函数
{int i,s=1; //循环变量和组合个数
if(n<0||m<0) return 0; //如果n和m有一个是负数返回0值
if(n<m) return 0; //如果n小于m,无法取到组合返回0值
if(m>n-m) m=n-m; //5取3组合等价于5取2组合,所以让m等于小的使程序简单化
for(i=0;i<m;i++) s=s*(n-i); //算出大数,比如5取2组合,先算5*4
for(i=0;i<m;i++) s=s/(1+i); //除以小数,比如5取2组合,把5*4除以1*2
return s;} //返回组合个数
int main() //主函数
{int n,m; //循环变量
printf("请输入n和m:");
scanf("%d %d",&n,&m);
printf("\n%d取%d的组合有%d种\n\n",n,m,C(n,m));
system("PAUSE"); //屏幕暂停,以便看到显示结果
return 0;} //结束程序
【运行结果】
以上程序在DEV C++中运行通过,结果准确无误。
展开全部
#include<iostream.h>
int fac(int k)//定义计算k阶乘的函数fac()
{
int t=1;
for(int i=1;i<=k;i++)
t*=i;
return t;
}
float Cmn(int M,int N)//定义计算组合数函数Cmn()
{
float p;
p=(float)fac(M)/(fac(n)*fac(M-N));//调用求阶乘函数fac(),注意此时是将结果强制转化为float类型
return p;
}
void main()
{
float s;
int m,n;
cout<<"m=";cin>>m;
cout<<endl<<"n=";cin>>n;
s=Cmn(m,n);//调用计算组合数函数Cmn()
cout<<endl<<"结果是:"<<s<<endl;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<iostream>
int main()
{
int m,n;
if((n<=0)||(n>50)||(m<0)||(m>n))
return 0;
scanf("%d %d",&n,&m);
printf("\n%d",n*m);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2017-07-03
展开全部
这组合数是怎么计算的,就是输入两个数的乘积?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询