我写了三个不同的版本,但其实核心都是一样的,第一个版本是用户输入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;
}