请教一个 C++的问题,求组合的

来源:百度知道 编辑:UC知道 时间:2024/05/30 05:50:46
///////**下面的是一个求组合的程序,已经编译过没有错误了,但是这里因为阶乘极容易益处,所以n最大才能取到12,否则运算中会发生益处,现在请大家来帮一帮我,修改一下这个程序,是其不容易益处.谢谢^*/

#include <iostream>
using namespace std;
long C(int,int),fac(int);
int main(){
int m,n;
cout<<"请输入两个实数m,n(m<n):\n";
cin>>m>>n;
if(m<=n) cout<<"C("<<m<<","<<n<<")="<<C(m,n)<<endl;
else cout<<"出现错误";
return 0;
}

long C(int i,int j){
long result;
result=fac(j)/(fac(i)*fac(j-i));
return result;
}

long fac(int i){
long facf;
if (i==0||i==1) facf=1;
else facf=fac(i-1)*i;
return facf;
}

#include <iostream>
using namespace std;
__int64 C(int,int),fac(int);
int main(){
int m,n;
cout<<"请输入两个实数m,n(m<n):\n";
cin>>m>>n;
if(m<=n) cout<<"C("<<m<<","<<n<<")="<<C(m,n)<<endl;
else cout<<"出现错误";
return 0;
}

__int64 C(int i,int j){
__int64 result;
result=fac(j)/(fac(i)*fac(j-i));
return result;
}

__int64 fac(int i){
__int64 facf;
if (i==0||i==1) facf=1;
else facf=fac(i-1)*i;
return facf;
}

这样应该能稍微好点

楼上的方法很好,不过有些编译器不支持,如果你的编译认_int64的话那就最好了。

把所有的long换成double,double可以表示1.7E +/- 308 够用了,只是double有效数字是前16位,也就是说在大于10的17次方的数是一个近似数了(去掉了末几位)。但我想这也够你用了。