您的位置:首页 > 其它

列出排列组合2^n种可能的方法

2015-06-02 12:03 232 查看

  被这个问题困扰了好久,只能做到输出n固定时的组合情况,今天看到了才恍然大悟,原来是用数字逻辑表示二进制数的方法来做的。
  上代码:

#include "stdio.h"
#include "math.h"

int main()
{
int n, max, temp, i;
printf("n:");
scanf("%d", &n);
max = pow(2, n);
while (--max >= 0)
{
i = 0;
temp = max;
while(temp)
{
printf("%d", temp % 2);
i++;
temp = temp / 2;
}
while(i++ < n)  printf("0");
printf("\n");
}
return 1;
}

  用短除法算出每一个二进制数。
  但是从树的角度看,其“遍历”的顺序是从叶子到根,不能边循环边遍历。而且这样输出的2^n个数的顺序不对。所以增加一个数组,使其能按照降序输出:

#include "stdio.h"
#include "stdlib.h"
#include "math.h"

int main()
{
static int n;
int max, flex, i;
printf ("n:");
scanf ("%d", &n);
int *temp1 = (int*)malloc(n * sizeof(int));
int *temp2 = (int*)malloc(n * sizeof(int));
max = (int)pow(2, n);
while (--max >= 0)
{
for (int k = 0; k < n; k++)
{
temp1[k] = temp2[k] = 0;
}
i = 0;
flex = max;
while (flex)
{
temp1[i] = flex % 2;
flex = flex / 2;
temp2[n-i-1] = temp1[i];
i++;
}
for (int k = 0; k < n; k++)
{
printf ("%d", temp2[k]);
}
printf ("\n");
}
return 1;
}

以上。

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: