如何求一个集合的全部子集?众所周知,一个元素数为n的集合全部子集数目为2n个,而n位的二进制有的全部组合数也为2n个,所以可以使用二进制打表法进行打表,输出所有结果。
这里是源代码:
#include<Windows.h>
#include<iostream>
using namespace std;
bool Add(int *Table,int n);
void Output(int *Array, int *Table,int n);
int main()
{
int n;
cout << "请输入元素数目:" << endl;
cin >> n;
int *Element = new int[n];
cout << "请依次输入元素:";
for (int i = 0; i < n; i++)
{
cin >> Element[i];
}
system("cls");
cout << "全部子集:" << endl;
int *Table = new int[n];
memset(Table, 0, sizeof(int)*n);
for (;;)
{
if (Add(Table,n) == TRUE)
{
Output(Element, Table,n);
}
else
{
break;
}
}
cout << "计算完成!";
system("pause");
return 0;
}
bool Add(int *Table,int n)
{
Table[0]++;
for (int i = 0; i < n - 1; i++)
{
if (Table[i]>1)
{
Table[i]-=2;
Table[i + 1]++;
}
}
if (Table[n - 1] > 1)
{
return FALSE;
}
return TRUE;
}
void Output(int *Array, int *Table,int n)
{
cout << "(";
for (int i = 0; i < n; i++)
{
if (Table[i] == 1)
{
cout << Array[i] << " ";
}
}
cout << ") ";
}