| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 408 人关注过本帖
标题:请给我的程序提点建议
只看楼主 加入收藏
yang20110816
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2011-4-6
结帖率:25%
收藏
已结贴  问题点数:10 回复次数:2 
请给我的程序提点建议
写一个程序:从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;
}

请多多指点!!!
搜索更多相关主题的帖子: return 委员会 
2011-04-14 14:01
mm1010220cs
Rank: 2
等 级:论坛游民
帖 子:36
专家分:98
注 册:2011-4-7
收藏
得分:10 
你试着运行过吗?结果应该有错
2011-04-20 13:23
mm1010220cs
Rank: 2
等 级:论坛游民
帖 子:36
专家分:98
注 册:2011-4-7
收藏
得分:0 
给你验证了下,做了两个方法:
方法一:注: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;
}

中午没睡觉弄的,楼主记得给分啊,哈哈!
2011-04-20 14:22
快速回复:请给我的程序提点建议
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032065 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved