描述 找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。
- 输入
- 输入n、r。 输出
- 按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。 样例输入 -
5 3
样例输出 -
543 542 541 532 531 521 432 431 421 321
<span style="font-size:18px;">#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 1000
int cmp(const void *a,const void *b);
int main()
{
int i = 0;
int j = 0;
int n = 0;
int r = 0;
int k = 0;
int data[10];
int num[10] = {1,2,3,4,5,6,7,8,9};
int result[MAX_LEN];
scanf("%d %d",&n,&r);
memset(result,0,sizeof(result));
for (i = 0; i < (1<<n); i++)
{
int m = 0;
int numdex = 0;
memset(data,0,sizeof(data));
for (j = 0; j < n; j++)
{
if (i & (1<<j))
{
data[numdex++] = num[j];
}
}
if (numdex == r)
{
int tmp = 0;
for (m = numdex-1; m >= 0; m--)
{
tmp = tmp * 10 + data[m];
}
result[k++] = tmp;
}
}
qsort(result,k,sizeof(result[0]),cmp);
for (k = k-1; k >= 0; k--)
{
printf("%d\n",result[k]);
}
return 0;
}
int cmp(const void *a,const void *b)
{
return *((int *)a) - *((int *)b);
}
</span>