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