一、思路来源
n 个元素就有 2^n 个 mask。
我的思路是将 [0, 2^n] 的数字直接转成二进制,然后按照得到的二进制 mask 输出子集。
二、代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int* convert_to_binary(int num, int num_in_decimal)
{
int* binaryArr = (int*)calloc(num, sizeof(int));
int idx = num - 1;
while (num_in_decimal != 0)
{
int remainder = num_in_decimal % 2;
*(binaryArr + idx) = remainder;
num_in_decimal = num_in_decimal / 2;
idx--;
}
while (idx >= 0)
{
*(binaryArr + idx) = 0;
idx--;
}
return binaryArr;
}
int main(void)
{
int num;
int* a;
scanf("%d", &num);
a = (int*)calloc(num, sizeof(int));
for (int i = 0; i < num; i++)
{
scanf("%d", a + i);
}
for (int i = 0; i < pow(2, num); i++)
{
int* mask = convert_to_binary(num, i);
printf("[");
for (int j = 0; j < num; j++)
{
if (*(mask + j) == 1)
{
printf("%d ", *(a + j));
}
}
printf("]\n");
}
return 0;
}
运行结果: