被这个问题困扰了好久,只能做到输出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;
}
以上。