【记得交作业】波波离散实验报告三(python实现)

实验名称集合运算

实验目的和要求掌握用计算机求集合的交、并、差和补运算的方法。

实验内容:

实验三 集合运算

编程实现集合的交、并、差和补运算。

【实验原理和方法】

  1. 用数组A,B,C,E表示集合。输入数组A,B,E(全集),输入数据时要求检查数据是否重复(集合中的数据要求不重复),要求集合A,B是集合E的子集。

以下每一个运算都要求先将集合C置成空集。

(2)二个集合的交运算:把数组A中元素逐一与数组B中的元素进行比较,将相同的元素放在数组C中,数组C便是集合A和集合B的交。

实验心得:

代码如下:

a=set(input('A:(数字用空格间隔)').split())
b=set(input('B:(数字用空格间隔)').split())
e=set(input('全集E:(数字用空格间隔)').split())
c=set()
print(e)
while a.issubset(e)==1:
    print('A',a,'是E的子集')
    break
while a.issubset(e)==0:
    a = set(input('重新输入A:(数字用空格间隔)').split())
while b.issubset(e)==1:
    print('B',b,'是E的子集')
    break
while b.issubset(e)==0:
    b = set(input('重新输入B:(数字用空格间隔)').split())
c=set(a&b)
if len(c)==0:
    print('AB的交集为空!')
else:
    print('AB的交集C=',c)

1.正确输入示例

 

2.A不是E的子集示例

 3.交集为空示例

 

 

代码可能存在借鉴,侵删!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法思路: 1. 分别遍历集合A和集合B中的元素,将它们加入到一个新的集合C中; 2. 对集合C中的元素进行去重操作,即如果集合C中已经存在该元素,则不再加入。 代码实现: ```c #include <stdio.h> #include <stdlib.h> #define MaxSize 100 typedef int ElemType; // 元素类型 typedef struct { ElemType data[MaxSize]; // 存储元素的数组 int length; // 顺序表的长度 } SqList; // 初始化一个顺序表 void InitList(SqList *L) { L->length = 0; } // 向顺序表中插入一个元素 int ListInsert(SqList *L, int i, ElemType e) { int j; if (i < 1 || i > L->length + 1) { return 0; // 插入位置不合法 } if (L->length >= MaxSize) { return 0; // 顺序表已满 } for (j = L->length; j >= i; j--) { L->data[j] = L->data[j - 1]; // 将第i个元素及之后的元素后移 } L->data[i - 1] = e; // 在位置i处插入元素e L->length++; // 长度加1 return 1; // 成功插入 } // 遍历顺序表,打印所有元素 void PrintList(SqList L) { int i; for (i = 0; i < L.length; i++) { printf("%d ", L.data[i]); } printf("\n"); } // 求两个集合的并集 void Union(SqList A, SqList B, SqList *C) { int i; // 将集合A中的元素依次加入集合C中 for (i = 0; i < A.length; i++) { ListInsert(C, C->length + 1, A.data[i]); } // 将集合B中的元素依次加入集合C中 for (i = 0; i < B.length; i++) { ListInsert(C, C->length + 1, B.data[i]); } // 对集合C中的元素进行去重 int j; for (i = 0; i < C->length; i++) { for (j = i + 1; j < C->length;) { if (C->data[j] == C->data[i]) { // 如果与前面的元素重复 // 将后面的元素前移 int k; for (k = j; k < C->length; k++) { C->data[k] = C->data[k + 1]; } C->length--; // 长度减1 } else { j++; // 继续比较下一个元素 } } } } int main() { SqList A, B, C; int i, n, m, e; printf("请输入集合A的元素个数:"); scanf("%d", &n); printf("请依次输入集合A中的%d个元素:", n); for (i = 0; i < n; i++) { scanf("%d", &e); ListInsert(&A, A.length + 1, e); } printf("请输入集合B的元素个数:"); scanf("%d", &m); printf("请依次输入集合B中的%d个元素:", m); for (i = 0; i < m; i++) { scanf("%d", &e); ListInsert(&B, B.length + 1, e); } InitList(&C); Union(A, B, &C); printf("集合A和集合B的并集为:"); PrintList(C); return 0; } ``` 注意事项: 1. 本算法中假设集合元素是整数类型,如果是其他类型,需要修改代码中的元素类型定义和输入方式。 2. 本算法中的去重操作采用暴力枚举的方式,间复杂度为 O(n^2),当集合元素较多效率较低,可以考虑使用其他高效的去重算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值