离散数学-集合的简单运算【并、交、差、补、环合(对称差)】

在这里插入图片描述

关于集合的并交差

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]);
	}  
    for(i=1;i<y;i++)
	{
		printf("%d ",bb[i]);
	}
	printf("  }\n"); */ 

	printf("A与B的差集={ ");
	for(i=1;i<x;i++)
	{
		printf("%d ",aa[i]);
	}
	printf("  }\n");

	/*printf("A与B的环积={ ");
	for(i=1;i<k;i++)
	{
		printf("%d ",c[i]);
	}
	for(i=1;i<g-1;i++)
	{
		printf("%d ",h[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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值