前言:
博主实力有限,博文有什么错误,请你斧正,非常感谢!
因为数组子集个数是2^n
这和n位二进制的所有排序结果个数(2^n)相同,另外数组中的数在所有子集中只有在,与不在==2种情况==。因此将1
表示为存在
,0
表示不存在
。int arr [4]={1,2,4,5};
0 0 0 0代表空子集
0 1 0 1 代表子集{1,4}
1 1 1 1代表子集{1,2,4,5}
void show(int* p, int x, int sz)
{
int i = 0;//用于记录位数
int j = 0;
int arr[100] = { 0 };
for (i = 0; i < sz; i++)
{
if (1 & x)//判断x的二进制补码与1 按位与 是否为1,为1这该位存在数。
{
arr[i] = p[i];
}
x = x >> 1;//对x的二进制补码右移1位,便于下次循环进行与 1 按位与&
}
//打印该子集
printf("{");
for ( j = 0; j < sz; j++)
{
if (arr[j])
{
printf("%d ", arr[j]);
}
}
printf("}\n");
}
void Part_board(int* p, int sz)
{
int i = 0;
for (i = 0; i < pow(2, sz); i++)//全1的情况与pow(2,sz)无关。
{
show(p, i, sz);
}
}
int main()
{
int arr[] = { 1,-2,3,5 };
int sz = sizeof(arr) / sizeof(*arr);
Part_board(arr, sz);
}