集合的一些运算(交,并,补,对称差)
集合运算介绍
- 交集
集合论中,设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;
}
}
总结
代码的每个子函数功能很明确
要有清晰的思路也还是不难的,打这些运算时不要手忙脚乱,打出来还是可以的