编程题目(二选一):
- 打印输出n元(n=1,2,3,4,5,6)集合的所有划分。
- 打印输出n元(n=1,2,3,4,5,6)集合的幂集中的所有元素。
编程内容及要求(二选一):
- 编写程序,打印输出n元(n=1,2,3,4,5,6)集合的所有划分。
- 编写程序,打印输出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++
程序设计简要描述:
- 储存结构:先用整型变量n来储存用户输入的值。然后创建含有n个元素的整型数组即集合A。
- 主要算法:由于含有n个元素的集合有2^n个子集,即每个元素都有取和不取两个可能。故将A中元素内容设置为n位的二进制序列,下标索引为i的元素若为1则子集中含有元素i+1;若为0则不含有该元素。让后根据得到的二进制序列向set.txt输出子集。
- 输入与输出的实现:用整型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<fstream>
#include<iostream>
#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;}elsecontinue;}f << '}';f << endl;}f.close();return 0;
}