有人机交互能力的排列组合算法(C++版)

来源:互联网 发布:旅行者金唱片 知乎 编辑:程序博客网 时间:2024/06/05 19:33

我写了三个不同的版本,但其实核心都是一样的,第一个版本是用户输入M和N,

不用输入实际参加排列组合的数.

第二个和第三个版本要输入用户想要参加排列组合的数,

不同在于函数的参数上,第二个是定义了一个全局数组,

所以核心函数jisuan()的参数没有改变,而第三个是定义了一个局部变量,

所以在jisuan()的参数中加上了一个数组参数,大家看了就知道了.

//第一个
#include   <iostream>
using namespace std;
void  jisuan(int a[],int m,int n,int k,int temp);
int numOfComb(int m, int n);
void  main()
{
    int  m,n;
    cout<<"请输入M和N:"<<endl;
    cin>>m>>n;
    cout<<"一共  "<<numOfComb(m,n)<<"  种组合"<<endl;
    int   a[100];
    jisuan(a,m,n,-1,-1);
}
void  jisuan(int a[],int m,int n,int k,int temp)
{
    temp++;
    if(temp<n)
        for(int i=k+1;i<m;i++)
        {
            a[temp]=i+1;       //赋值
            jisuan(a,m,n,i,temp);    //递归调用
        }
    else
    {
        for(int j=0;j<n;j++)
        {
            cout<<"/t"<<a[j];  //输出
        }
        cout<<endl;
    }
}
//计算个数
int numOfComb(int m, int n)
{
    int r=1;
    int i;

    for(i=1; i<=n; ++i)
    {
        r *= (m-i+1);
        r /= i;
    }

    return r;
}


//第二个
#include   <iostream>
using namespace std;
void  jisuan(int a[],int m,int n,int k,int temp);
int numOfComb(int m, int n);
int comb[100];
void  main()
{
    int m,n;
    int i=0;
    cout<<"请输入要参加排列组合的数(以 -1 结束):"<<endl;    //注意参加排列组合的数不能有-1,如果非要有-1
    cin>>comb[i];                                           //可以把这个条件改一改
    while(comb[i]!=-1)
    {
        i++;
        cin>>comb[i];
    }
     m=i;
    if(comb[0]==-1)
    {
         exit(0);
    }
    cout<<"请输入要提取的个数 n:"<<endl;
    cin>>n;
    cout<<"一共  "<<numOfComb(m,n)<<"  种组合"<<endl;
    int   a[100];
    jisuan(a,m,n,-1,-1);
}
void  jisuan(int a[],int m,int n,int k,int temp)
{
    temp++;
    if(temp<n)
        for(int i=k+1;i<m;i++)
        {
            a[temp]=i+1;       //赋值
            jisuan(a,m,n,i,temp);    //递归调用
        }
    else
    {
        for(int j=0;j<n;j++)
        {
            cout<<"/t"<<comb[a[j]-1];  //输出
        }
        cout<<endl;
    }
}
//计算个数
int numOfComb(int m, int n)
{
    int r=1;
    int i;

    for(i=1; i<=n; ++i)
    {
        r *= (m-i+1);
        r /= i;
    }

    return r;
}

//第三个
#include   <iostream>
using namespace std;
void  jisuan(int a[],int m,int n,int k,int temp,int com[]);
int numOfComb(int m, int n);
void  main()
{
    int m,n;
    int i=0;
    int comb[100];
    cout<<"请输入要参加排列组合的数(以 -1 结束):"<<endl;
    cin>>comb[i];
    while(comb[i]!=-1)
    {
        i++;
        cin>>comb[i];
    }
     m=i;
    if(comb[0]==-1)
    {
         exit(0);
    }
    cout<<"请输入要提取的个数 n:"<<endl;
    cin>>n;
    cout<<"一共  "<<numOfComb(m,n)<<"  种组合"<<endl;
    int   a[100];
    jisuan(a,m,n,-1,-1,comb);
}
void  jisuan(int a[],int m,int n,int k,int temp,int com[])
{
    temp++;
    if(temp<n)
        for(int i=k+1;i<m;i++)
        {
            a[temp]=i+1;       //赋值
            jisuan(a,m,n,i,temp,com);    //递归调用
        }
    else
    {
        for(int j=0;j<n;j++)
        {
            cout<<"/t"<<com[a[j]-1];  //输出
        }
        cout<<endl;
    }
}
//计算个数
int numOfComb(int m, int n)
{
    int r=1;
    int i;

    for(i=1; i<=n; ++i)
    {
        r *= (m-i+1);
        r /= i;
    }

    return r;
}
 

 

这三个程序我在编程中国论坛上也发表了,发贴人叫"冰的热度",其实就是我.

大家不要大惊小怪,yonghengzhimi和"冰的热度"是一个人,就是我

原创粉丝点击