给你验证了下,做了两个方法:
方法一:注:unsigned long long类型存放的数据较大,计算较小数的阶乘还是可以的;
unsigned long long fun (int n){
unsigned long long a=1;
for(int i=1;i<=n;i++)
a=a*i;
return a;
};
int main(){
int N,K;
//unsigned long long M;
//M是组合数;N是总人数;K是委员会的人数;P就是(N-K)
根据组合的公式:M=N/(K*(N-K))
cout<<"input the N and K:"<<endl;
cin>>N;
cin>>K;
if(N<K)
return 0;
if(N == K)
//else
cout<<"M="<<1<<endl;
//M是组合数
else
cout<<"M="<<fun(N)/(fun(K)*fun(N-K))<<endl;
return 0;
}
方法二:较方法一要好很多
unsigned long long fun (int n, int k){
//直接返回结果;
unsigned long long a=1;
/*利用数学的约分法编写以下代码
因为是三个阶乘的乘除运算:N!/(K!*(N-K)!),因此哪个大约哪个,然后再计算,这样运算中乘机出来的最大值一般不会大得数据类型
容纳不下,而使结果出现错误*/
if( k > (n-k) )
{
for(int i=k+1;i<=n;i++)
a=a*i;
return a/(n-k);
}
else
{
for(int i=n-k+1;i<=n;i++)
a=a*i;
return a/k;
}
};
int main(){
int N,K;
//unsigned long long M;
//M是组合数;N是总人数;K是委员会的人数;P就是(N-K)
根据组合的公式:M=N/(K*(N-K))
cout<<"input the N and K:"<<endl;
cin>>N;
cin>>K;
if(N<K)
return 0;
if(N == K)
//else
cout<<"M="<<1<<endl;
else
cout<<"M="<<fun(N,K)<<endl;
//M是组合数,fun函数直接给出结果
int stop;
cin>>stop;
return 0;
}
中午没睡觉弄的,楼主记得给分啊,哈哈!