C++递归求排列组合,在线等
给定两个自然数n(1~9)和r(n>r),请编程输出从1~n中按降序排序取r个自然数的所有组合。如n=5,r=3时,输出结果为:543,542,541,532,531,432,431,421,321。(递归函数
#include<iostream>
#include<cstring>
using namespace std;
int C(int n,int k) //计算从n各种选k个的取法
{
int product=1;
for(int x=n;x>n-k;x--) product*=x;
for(int x=1;x<=k;x++) product/=x;
return product;
}
void combination(int n,int r,char *a[])
{
if(r==1)//r=1的情况
{
for(int i=0;i<n;i++) a[i][0]=n-i+'0';
}
else if(n==r)//n=r时,只有一种排列方式
{
for(int i=0;i<n;i++) a[0][i]=n-i+'0';
}
else //一般情况,利用C(n,r)=C(n-1,r-1)(即第一个元素为n,再从1至n-1中挑r-1个)+C(n-1,r)(从1至n-1中挑r个)
{
char **p=new char*[C(n-1,r-1)];//为此种情况做准备:C(n,r)=C(n-1,r-1)(即第一个元素为n,再从1至n-1中挑r-1个)
for(int i=0;i<C(n-1,r-1);i++) p[i]=new char[r-1];
char **q=new char*[C(n-1,r)];//为此种情况做准备:C(n-1,r)(从1至n-1中挑r个)
for(int i=0;i<C(n-1,r);i++) q[i]=new char[r];
//第一种情况
combination(n-1,r-1,p);
for(int i=0;i<C(n-1,r-1);i++)
{
a[i][0]=n+'0';
for(int j=0;j<r-1;j++) a[i][j+1]=p[i][j];
}
for(int i=0;i<C(n-1,r-1);i++) delete[] p[i];
delete[] p;
//第二种情况
combination(n-1,r,q);
for(int i=C(n-1,r-1);i<C(n,r);i++)
{
for(int j=0;j<r;j++) a[i][j]=p[i-C(n-1,r-1)][j];
}
for(int i=0;i<C(n-1,r);i++) delete[] q[i];
delete[] q;
}
}
int main()
{
//输入
int n,r;
do
{
cout<<"请输入两个自然数n(1~9)和r(n>r),以编程输出从1~n中按降序排序取r个自然数的所有组合:"<<endl;
cin>>n>>r;
}while(n<=r||r<1||n>9);
//处理
char **a=new char*[C(n,r)];
for(int i=0;i<C(n,r);i++) a[i]=new char[r];
combination(n,r,a);
//输出
cout<<"组合方式如下:"<<endl;
for(int i=0;i<C(n,r);i++)
{
for(int j=0;j<r;j++) cout<<a[i][j];
cout<<"\t";
}
//善后
for(int i=0;i<C(n,r);i++) delete[] a[i];
delete[] a;
return 0;
}
请问问题出在哪里??
[解决办法]
你执行的时候显示了什么问题?
[解决办法]
我这里总之iostream和cstring都找不到,不知道什么原因。但是我想你遇到的不是这个问题吧?
[解决办法]
#include<stdio.h>#include<stdlib.h>#include<malloc.h>void func(int n, const int r, int res[], int cnt){ if (r == cnt || 0 == n) { if (r == cnt) { int i; for (i = 0; i < r; ++i) { printf("%d", res[i]); } printf("\n"); } } else { res[cnt] = n; func(n - 1, r, res, cnt + 1); func(n - 1, r, res, cnt); }}int main(){ int n, r; int *res; puts("input n, r :"); scanf("%d%d", &n, &r); if (n < 1 || r < 1 || n < r) { return -1; } if (NULL == (res = (int *)malloc(sizeof(int) * r))) { return -1; } func(n, r, res, 0); free(res); res = NULL; system("pause"); return 0;}