
关于集合的并交差
1.集合的常用运算:
并集:X∪Y={x | x∈X或x∈Y}。
交集:X∩Y={x | x∈X且x∈Y}。
差集:X-Y={x | x∈X且x∉Y}。
如果X∩Y=∅,那么集合X与Y不相交。如果集合X和Y是集族S中的不同集合且X和Y不相交,那么集族S两两不相交。
#include <stdio.h>
#define N 100
main()
{
int a[N],b[N],c[N],d[N],e[N],h[N];
int aa[N],bb[N],ee[N],ff[N];
int i,j,k=1;
int x=1,y=1,z=1,o=1,g=1;
int m,n,w;
int flag;
printf("请输入集合A的元素个数:\n");
scanf("%d",&m);
printf("输入集合A的元素:\n");
for(i=1;i<=m;i++)
{
scanf("%d",&a[i]);
}
printf("请输入集合B的元素个数:\n");
scanf("%c",&n);
printf("输入集合B的元素:\n");
for(i=1;i<=n;i++)
{
scanf("%d",&b[i]);
}
printf("请输入集合E(全集)的元素个数:\n");
scanf("%c",&w);
printf("输入集合E的元素:\n");
for(i=1;i<=w;i++)
{
scanf("%d",&e[i]);
}
for(i=1;i<=m;i++)
{
flag=0;
for(j=1;j<=n;j++)
{
if(a[i]==b[j])
{
c[k]=a[i];
k++;
flag=1;
continue;
}
}
if(flag==0)
{
aa[x]=a[i];
x++;
}
}
for(i=1;i<=n;i++)
{
flag=0;
for(j=1;j<=m;j++)
{
if(a[j]==b[i])
{
flag=1;
continue;
}
}
if(flag==0)
{
bb[y]=b[i];y++;
}
}
for(i=1;i<=w;i++)
{
flag=0;
for(j=1;j<=m;j++)
{
if(a[j]==e[i])
{
flag=1;
continue;
}
}
if(flag==0)
{
ee[z]=e[i];z++;
}
}
for(i=1;i<=w;i++)
{
flag=0;
for(j=1;j<=n;j++)
{
if(b[j]==e[i])
{
flag=1;
continue;
}
}
if(flag==0)
{
ff[o]=e[i];o++;
}
}
for(i=1;i<=o;i++)
{
flag=0;
for(j=1;j<=z;j++)
{
if(ee[j]==ff[i])
{
flag=1;
h[g]=ff[i];
g++;
continue;
}
}
}
printf("A与B的交集={ ");
for(i=1;i<k;i++)
{
printf("%d ",c[i]);
}
printf(" }\n");
printf("A与B的并集={ ");
for(i=1;i<x;i++)
{
printf("%d ",aa[i]);
}
for(i=1;i<y;i++)
{
printf("%d ",bb[i]);
}
for(i=1;i<k;i++)
{
printf("%d ",c[i]);
}
printf(" }\n");
printf("A与B的差集={ ");
for(i=1;i<x;i++)
{
printf("%d ",aa[i]);
}
printf(" }\n");
}
2.集合的补集:所研究的集合都是某个集合U的子集,此时U称为全集或全域。给定全集U和U的一个子集X,集合U-X称为X的余(补)集。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 100
#define M 50
void create_array(int a[], int n)
{
int i;
for (i = 1; i <= n; i++) {
a[i] = ((rand() % 100) + 1);
}
a[0] = n;
}
int cnt;
void printf_buji_arrray(int a[])
{
int i;
printf("数组为{");
printf(" ");
for (i = 1; i <= a[0]; i++) {
printf(" %d ", a[i]);
}
printf("}\n");
}
void union_buji_array(int a[], int b[])
{
int i, j, k;
cnt = 1;
for (i = 1; i <= a[0]; i++)
{
for (j = 1; j <= b[0]; j++)
{
if (a[i] == b[i])
a[i] = 0;
}
}
}
int main()
{
int a[N] = { 0 }, b[N] = { 0 };
int i;
printf("随机生成数组\n");
create_array(a, 5);
printf_buji_arrray(a);
create_array(b, 5);
printf_buji_arrray(b);
union_buji_array(a, b);
printf("补集:\n");
printf("数组为{");
for (i = 1; i <= a[0]; i++)
{
while (a[i] != 0)
{
printf(" %d ", a[i]);
break;
}
}
printf("}\n");
}
3.集合的环和(对称差)。给定集合A,B,定义对称差运算△如下:A△B = (A-B)∪(B-A)。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 100
#define M 50
void create_array(int a[], int n)
{
int i;
for (i = 1; i <= n; i++) {
a[i] = ((rand() % 100) + 1);
}
a[0] = n;
}
int cnt;
void printf_huanhe_arrray(int a[])
{
int i;
printf("数组为{ ");
for (i = 1; i <= a[0]; i++) {
printf(" %d ", a[i]);
}
printf("}\n");
}
void union_huanhe_array(int a[], int b[])
{
int x, i, j, temp;
cnt = 0;
for (i = 1; i <= a[0]; i++)
{
x = a[i];
temp = 0;
for (j = 1; j <= b[0]; j++)
if (x == b[j])
temp = 1;
if (temp)
{
a[i] = -10;
cnt++;
}
}
}
void bingji_huanhe_array(int a[], int b[])
{
int x, i, j;
for (i = 1; i <= b[0]; i++)
{
x = b[i];
for (j = 1; j <= a[0]; j++)
if (x == a[j])
break;
if (j>a[0]) {
a[a[0] + 1] = x;
a[0]++;
}
}
}
int main()
{
int a[N] = { 0 }, b[N] = { 0 };
printf("随机生成数组");
create_array(a, 5);
printf_huanhe_arrray(a);
create_array(b, 5);
printf_huanhe_arrray(b);
union_huanhe_array(a, b);
union_huanhe_array(b, a);
bingji_huanhe_array(a, b);
printf("环和");
printf_huanhe_arrray(a);
}