上面的是从n开始选择
下面这个是从1开始
#include<stdio.h>
#define nn 10
int n,r;
int a[nn],k;
void comb(int s,int j)
{
int i;
for (i=s;i<=n-j+1;i++)
{
a[r-j]=i; //选择第r-j(0,1,...)数
if (j>1)
comb(i+1,j-1);
else
{
for (k=0;k<r;k++)
printf("%4d",a[k]);
printf("/n");
}
}
}
int main(void)
{
printf("n,r:");
scanf("%d,%d",&n,&r);
comb(1,r);
}
下面这个也是,不过没有用递归
#include <stdio.h>
#include <stdlib.h>
void comb(int *a, int n,int r)
{
int ri, i=r-1, *is;
is = (int *)malloc(r+1);
is[r-1] = is[r] = 0;
while( i < r )
{
for(; i>0; i--) /* 底层至i层循环初始化 */
is[i-1] = is[i] + 1;
while( i <r ) /* 打印一个组合 */
printf("%4d", a[ is[i++] ]);
printf("/n");
for(i = 0, ri = n; ++is[i] >= ri; i++) /* 底层循环变量加1,如置边界,下一循环变量加1 */
ri--;
}
free(is);
}
void main()
{
int a[]= { 1, 2, 3, 4, 5};
comb(a, 5, 3);
}