急急急急急急急急急急急求大神解此题(C++)重赏 255

数据范围:0<n<=50,0<=m<=n... 数据范围:0<n<=50,0<=m<=n 展开
 我来答
czy7812
2017-07-03 · TA获得超过2668个赞
知道小有建树答主
回答量:518
采纳率:88%
帮助的人:183万
展开全部
【解题思路】
组合的计算公式是: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++中运行通过,结果准确无误。
物理公司的
2017-07-03 · TA获得超过5695个赞
知道大有可为答主
回答量:6105
采纳率:86%
帮助的人:1314万
展开全部
#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;  
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友c64b3f2
2017-07-03 · 超过12用户采纳过TA的回答
知道答主
回答量:30
采纳率:0%
帮助的人:11.7万
展开全部
#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
展开全部
这组合数是怎么计算的,就是输入两个数的乘积?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式