集合的运算

    xiaoxiao2023-10-09  192

    集合的一些运算(交,并,补,对称差)

    集合运算介绍

    交集

    集合论中,设A,B是两个集合,由所有属于集合A且属于集合B的元素所组成的集合,叫做集合A与集合B的交集(intersection),记作A∩B。 即:A∩B= {x|x∈A∧x∈B}。

    并集

    若A和B是集合,则A和B并集是有所有A的元素和所有B的元素,而没有其他元素的集合。A和B的并集通常写作 “A∪B”,读作“A并B”,用符号语言表示,即:A∪B={x|x∈A,或x∈B} 形式上,x是A∪B的元素,当且仅当x是A的元素,或x是B的元素。

    补集

    1、相对补集 若A和B 是集合,则A 在B 中的相对补集是这样一个集合:其元素属于B但不属于A,B - A = { x| x∈B且x∉A}。 2、绝对补集 若给定全集U,有A⊆U,则A在U中的相对补集称为A的绝对补集(或简称补集),写作∁UA。 注意:学习补集的概念,首先要理解全集的相对性,补集符号∁UA有三层含义: 1、A是U的一个子集,即A⊆U; 2、∁UA表示一个集合,且∁UA⊆U; 3、∁UA是由U中所有不属于A的元素组成的集合,∁UA与A没有公共元素,U中的元素分布在这两个集合中。

    对称差

    对称差相当于两个相对补集的并集,即: 也可以表示为两个集合的并集减去它们的交集: 或者用 异或 运算表示: 在对称差运算中,空集是单位元,任何元素都是其自身的逆元。

    代码展示

    #include<stdio.h> #include<string.h> char jiaoji[100][20],a[100][20],b[100][20],bingji[200][20],buji[100][20],duichengcha[200][20]; int c; int main(){ memset(jiaoji,'\0',sizeof(jiaoji)); memset(a,'\0',sizeof(a)); memset(b,'\0',sizeof(b)); memset(bingji,'\0',sizeof(bingji)); memset(buji,'\0',sizeof(buji)); memset(duichengcha,'\0',sizeof(duichengcha)); void dui(int m,int n,int u); void bu(int m,int n,int u); void jiao(int m,int n); void bing(int m,int n,int u); int i,j,m,n; printf("请输入2个集合的元素个数:\n"); //输入两个集合元素个数 scanf("%d%d",&m,&n); printf("请输入第一个集合元素:\n"); //输入两个集合元素 for(i=0;i<m;i++) scanf("%s",a[i]); printf("请输入第二个集合元素:\n"); for(j=0;j<n;j++) scanf("%s",b[j]); jiao(m,n); //集合的子函数 bing(c,n,m); bu(c,n,m); dui(c,n,m); printf("集合的交集:\n"); //打印交集 for(i=0;jiaoji[i][0]!='\0';i++){ printf("%s",jiaoji[i]); printf(" "); } printf("\n"); printf("集合的并集:\n"); //打印并集 for(i=0;bingji[i][0]!='\0';i++){ printf("%s",bingji[i]); printf(" "); } printf("\n"); printf("集合B对于A补集:\n"); //打印补集 for(i=0;buji[i][0]!='\0';i++){ printf("%s",buji[i]); printf(" "); } printf("\n"); printf("集合AB对称差:\n"); //打印对称差 for(i=0;duichengcha[i][0]!='\0';i++){ printf("%s",duichengcha[i]); printf(" "); } return 0; } void jiao(int m,int n){ c=0; int i,j; for(i=0;i<m;i++){ for(j=0;j<n;j++){ if(strcmp(a[i],b[j])==0)strcpy(jiaoji[c++],a[i]); } } } void bing(int m,int n,int u){ //m为交集元素个数,n为b数组元素个数,u为a数组元素个数 int i,j; int k=1; for(i=0;i<u;i++){ strcpy(bingji[i],a[i]); } int h=u; for(i=0;i<n;i++){ for(j=0;j<m;j++){ if(strcmp(jiaoji[j],b[i])==0)k=0; } if(k)strcpy(bingji[h++],b[i]); k=1; } } void bu(int m,int n,int u){ //m为交集元素个数,n为b数组元素个数,u为a数组元素个数 int i,j; int k=1; int q=0; for(i=0;i<u;i++){ for(j=0;j<m;j++){ if(strcmp(jiaoji[j],a[i])==0)k=0; } if(k)strcpy(buji[q++],a[i]); k=1; } } void dui(int m,int n,int u){ //m为交集元素个数,n为b数组元素个数,u为a数组元素个数 int i,j; int p=0; int k=1; for(i=0;i<u;i++){ for(j=0;j<m;j++){ if(strcmp(jiaoji[j],a[i])==0)k=0; } if(k)strcpy(duichengcha[p++],a[i]); k=1; } for(i=0;i<n;i++){ for(j=0;j<m;j++){ if(strcmp(jiaoji[j],b[i])==0)k=0; } if(k)strcpy(duichengcha[p++],b[i]); k=1; } }

    总结

    代码的每个子函数功能很明确 要有清晰的思路也还是不难的,打这些运算时不要手忙脚乱,打出来还是可以的

    最新回复(0)