注册 登录
编程论坛 VC++/MFC

请给我的程序提点建议

yang20110816 发布于 2011-04-14 14:01, 408 次点击
写一个程序:从n个人中选择k个人组成一个委员会的不同组合数。  我的做法如下,看下有什么建议提下

#include <iostream>
using namespace std;

int fun (int n){
    int i;
    int a=1;
    for(i=1;i<=n;i++)
        a=a*i;   
    return a;

}


int main(){
    int N,M,K,P;   //M是组合数;N是总人数;K是委员会的人数;P就是(N-K)    根据组合的公式:M=N/(K*(N-K))  
    int n;
    cout<<"input the N and K:"<<endl;
    cin>>N>>K;
    if(N<K)
        return 0;
    else
        n=N;
    int y=fun(n);
    cout<<y<<endl;
        n=K;
        int j=fun(n);
    cout<<j<<endl;
        P=(N-K);
        n=P;
        int w=fun(n);
        cout<<w<<endl;
        cout<<"M="<<y/(j*w)<<endl;
        return 0;
}

请多多指点!!!
2 回复
#2
mm1010220cs2011-04-20 13:23
你试着运行过吗?结果应该有错
#3
mm1010220cs2011-04-20 14:22
给你验证了下,做了两个方法:
方法一:注: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;
}

中午没睡觉弄的,楼主记得给分啊,哈哈!
1