C++ 程序生成所有子集对,它们的并集构成集合

c++server side programmingprogramming更新于 2024/10/25 2:17:00

这是一个 C++ 程序,用于生成所有子集对,它们的并集构成集合。

算法

开始
   function UnionSet():
   参数:
      a[] = 一个数组。
      n = 元素数量。
      函数主体:
      1) 为所有 2^(n-1) 对生成从 0 到 2^(n-1)-1 的二进制代码。
      2) 打印每个代码在代码字符串中相应索引为 0 或 1 的数组元素。
      3) 将它们打印到不同的集合中,这两个集合的并集将产生超集。
结束

示例

#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std;
void display(char code[], int a[], int n) //显示对
{
   int i;
   cout<<"\t{ ";
      for(i = 0; i < n; i++) {
         if(code[i] == '1')
            cout<<a[i]<<" ";
      }
   cout<<"}";
   cout<<" { ";
      for(i = 0; i < n; i++) {
         if(code[i] == '0')
            cout<<a[i]<<" ";
      }
   cout<<"}\n";
}
void UnionSet(int a[], int n) {
   int i, r, l;
   char binary[n];
   r = pow(2, n-1);
   for(i = 0; i < n; i++)
      binary[i] = '0';
   for(i = 0; i < r; i++) {
      display(binary, a, n);
      l=n-1;
      h:
      if(binary[l] == '0')
         binary[l] = '1';
      else {
         binary[l] = '0';
         l--;
         goto h;
      }
   }
}
int main() {
   int i, n;
   cout<<"\n输入元素数量:";
   cin>>n;
   int a[n];
   cout<<"\n";
   for(i = 0; i < n; i++) {
      cout<<"输入"<<i+1<<"个元素:";
    cin>>a[i];
   }
   cout<<"\n可能通过并集生成超集的子集对如下:\n";
   UnionSet(a, n);
   return 0;
}

输出

输入元素数量:4
输入 1 个元素:4
输入 2 个元素:3
输入 3 个元素:2
输入 4 个元素:1
可能通过并集生成超集的子集对如下:
{ } { 4 3 2 1 }
{ 1 } { 4 3 2 }
{ 2 } { 4 3 1 }
{ 2 1 } { 4 3 }
{ 3 } { 4 2 1 }
{ 3 1 } { 4 2 }
{ 3 2 } { 4 1 }
{ 3 2 1 } { 4 }

相关文章