组合C(N,M)【一个思路,两种解法】

来源:互联网 发布:淘宝刷单一天能赚多少 编辑:程序博客网 时间:2024/05/01 10:48
 

//下边的代码可以输出各种组合,如果添加一个int全局变量就可以统计个数了。

//如果只统计个数可以用f(n,m)=f(n-1,m-1)+f(n-1,m);而不用拷贝数组、输出数组之类的~

//注意b   free的位置,写错2次

//malloc(b)应该放在结束条件之后

#include <stdio.h>
#include <stdlib.h>
#define N 5
#define M 4
void f(int n,int m,int x,int *a)
{
 int *b,i;
 if (x == M)
 {
  for(i=0;i<M;i++)printf("%3d",a[i]);
  printf("\n");
  return;
 }
 if (n<m || m<=0)
 {
  return;
 }
 *(a+x) = n;
 f(n-1,m-1,x+1,a);
 b = (int *)malloc(sizeof(int)*M);
 for (i=0;i<x;i++) *(b+i) = *(a+i);
 f(n-1,m,x,b);
 free(b);
}
void main()
{
 int *a;
 a = (int *)malloc(sizeof(int)*M);
 f(N,M,0,a);
  free(a);
}

 

//另一种解法。【用循环代替了一重递归】

#include <stdio.h>
#include <stdlib.h>
#define N 5
#define M 3
int sum;
void f(int n,int m,int *a)
{
 int i,j;
 for (i=n;i>=m;i--)//注意循环条件从n---m
 {
  a[m-1] = i;
  if (m>1)
  {
   f(i-1,m-1,a);
  }
  else
  {
   for(j=M-1;j>=0;j--) printf("%3d",a[j]);
   sum++;
   printf("\n");
  }
 }
}
void main()
{
 int *a;
 a = (int *)malloc(sizeof(int)*M);
 f(N,M,a);
 printf("%3d\n",sum);
 free(a);
}

原创粉丝点击