首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++递归求排列组合

2012-05-05 
C++递归求排列组合,在线等给定两个自然数n(1~9)和r(nr),请编程输出从1~n中按降序排序取r个自然数的所有组

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都找不到,不知道什么原因。但是我想你遇到的不是这个问题吧?
[解决办法]

C/C++ code
#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;} 

热点排行