离散数学编程作业:输出n元集合的所有划分或幂集元素

编程题目(二选一):

  1. 打印输出n元(n=1,2,3,4,5,6)集合的所有划分。
  2. 打印输出n元(n=1,2,3,4,5,6)集合的幂集中的所有元素。

编程内容及要求(二选一):

  1. 编写程序,打印输出n元(n=1,2,3,4,5,6)集合的所有划分。
  2. 编写程序,打印输出n元(n=1,2,3,4,5,6)集合的幂集中的所有元素。

编程语言可选择C、C++、Java或Python。

划分输出格式示例:

------------------

n=2, A={1,2}

------------------

{{1},{2}}

{{1,2}}

------------------

幂集元素输出格式示例:

------------------

n=2, A={1,2}

------------------

{}

{1}

{2}

{1,2}

------------------

编程目的:学会用程序语言实现基本的排列组合枚举和数据集合的操作。

编程语言:

C++

程序设计简要描述:

  1. 储存结构:先用整型变量n来储存用户输入的值。然后创建含有n个元素的整型数组即集合A。
  2. 主要算法:由于含有n个元素的集合有2^n个子集,即每个元素都有取和不取两个可能。故将A中元素内容设置为n位的二进制序列,下标索引为i的元素若为1则子集中含有元素i+1;若为0则不含有该元素。让后根据得到的二进制序列向set.txt输出子集。
  3. 输入与输出的实现:用整型n储存用户输入(std::cin>>n),格式化输出n的值和A集合及它的子集到set.txt中。

输出的字符文件set.txt内容(粘贴):

-------------------------------
n = 3	A = {1,2,3}
-------------------------------
{}
{3}
{2}
{2,3}
{1}
{1,3}
{1,2}
{1,2,3}

源程序代码:

#include
#include
#define MAX 100
using namespace std;
int main() {
	fstream f;
	f.open("set.txt", ios::out);
	int arr[MAX] = { 0 };
	int n = 0;
	cin >> n;
	int t = n;
	int c = n;
	bool flag = 0;
	f << "-------------------------------" <<
		endl << "n = " << n << '\t' << "A = {";
	for (int i = 0; i < n; i++)
	{
		if (flag == 1)
			f << ',';
		f << i + 1;
		flag = 1;
	}
	f << '}' << endl;
	f << "-------------------------------" << endl;
	for (int i = 0; i < pow(2, n); i++)    //A共有2^n个子集
	{
		for (int f = 0; f < n; f++)        //将数组归零
		{
			arr[f] = 0;
		}
		t = n;                             //t来索引
		c = i;							   //c来求出i的二进制序列
		while (c > 0)
		{
			arr[t - 1] = c % 2;
			c = c / 2;
			t--;
		}
		flag = 0;                          //最后一个元素不带逗号
		f << '{';
		for (int i = 0; i < n; i++)
		{
			if (arr[i] == 1)               //根据二进制序列输出对应子集
			{
				if (flag == 1)
					f << ',';
				f << i + 1;
				flag = 1;
			}
			else
				continue;
		}
		f << '}';
		f << endl;
	}
	f.close();
	return 0;
}

你可能感兴趣的:(c++)