您的位置:首页 > 编程语言 > C语言/C++

【算法】 组合数问题非递归解法

2014-04-22 11:18 302 查看
描述 找出从自然数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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C语言 算法