1、给定含有n个元素集合U的两个子集A和B,求出~A, A∪B,A∩B, A⊕B和A-B,给定来自同一全集的两个多重集合A和B,试求A∪B,A∩B, A-B和A+B

注意:两个功能都可实现合并为一个代码,但是并集函数略有定义错误,当出现多重集合时,应当表示为A+B而不是并集形式

1、给定含有n个元素集合U的两个子集A和B,求出~A, A∪B,A∩B, A⊕B和A-B

(1)首先明确并集、交集、差集、对称差、补集写成自定义函数

(2)其次,考虑主函数,在主函数中输入全集U,子集A和B,自定义函数的功能可以通过switch语句让用户自己选择决定

#include <stdio.h>
#include <stdlib.h>
#define N 50

//思路,知道集合A和集合B,利用一个空数组C把A中的集合复制到C中,然后比较A和B,
//当且仅当两者不相等时,存入B中与A不相等的元素
void bingji(int A[],int B[],int la,int lb)
{
    int C[N]={0};
    int i,j,m,k;
    printf("集合A为:\n");
    for(i=0;i<la;i++)
    {
        printf("%d   ",A[i]);
    }
    printf("\n集合B为:\n");
    for(j=0;j<lb;j++)
    {
        printf("%d   ",B[j]);
    }
    for(m=0;m<la;m++)
    {
        C[m]=A[m];
    }
    for(i=0;i<lb;i++)
    {
        int flag=0;
        for(j=0;j<la;j++)
        {
            if(B[i]==A[j])
            {
                flag=1;
            }
        }
        if(flag==0)
        {
            C[m]=B[i];
            m++;
        }
    }
    printf("\n并集为:\n");
    for(k=0;k<(la+lb);k++)
    {
        if(C[k]==0)
        {
            break;
        }
        printf("%d   ",C[k]);
    }
}

void jiaoji(int A[],int B[],int la,int lb)
{
    int C[N]={0};
    int i,j,m,k;
    m=0;
    printf("集合A为:\n");
    for(i=0;i<la;i++)
    {
        printf("%d   ",A[i]);
    }
    printf("\n集合B为:\n");
    for(j=0;j<lb;j++)
    {
        printf("%d   ",B[j]);
    }
    for(i=0;i<lb;i++)
    {
        int flag=1;
        for(j=0;j<la;j++)
        {
            if(B[i]==A[j])
            {
                flag=0;
            }
        }
        if(flag==0)
        {
            C[m]=B[i];
            m++;
        }
    }
    printf("\n交集为:\n");
    for(k=0;k<m;k++)
    {
        if(C[k]==0)
        {
            break;
        }
        printf("%d   ",C[k]);
    }
}


void chaji(int A[],int B[],int la,int lb)
{
    int C[N]={0};
    int i,j,m,k;
    m=0;
    printf("集合A为:\n");
    for(i=0;i<la;i++)
    {
        printf("%d   ",A[i]);
    }
    printf("\n集合B为:\n");
    for(j=0;j<lb;j++)
    {
        printf("%d   ",B[j]);
    }
    for(i=0;i<la;i++)
    {
        int flag=1;
        for(j=0;j<lb;j++)
        {
            if(B[i]==A[j])
            {
                flag=0;
            }
        }
        if(flag==1)
        {
            C[m]=A[i];
            m++;
        }
    }
    printf("\n差集为(A-B):\n");
    for(k=0;k<m;k++)
    {
        if(C[k]==0)
        {
            break;
        }
        printf("%d   ",C[k]);
    }
}

void duichencha(int A[],int B[],int la,int lb)
{
    int C[N]={0};
    int D[N]={0};
    int i,j,m,n,k;
    m=0;
    n=0;
    printf("集合A为:\n");
    for(i=0;i<la;i++)
    {
        printf("%d   ",A[i]);
    }
    printf("\n集合B为:\n");
    for(j=0;j<lb;j++)
    {
        printf("%d   ",B[j]);
    }
    for(i=0;i<lb;i++)
    {
        int flag=1;
        for(j=0;j<la;j++)
        {
            if(B[i]==A[j])
            {
                flag=0;
            }
        }
        if(flag==1)
        {
            C[m]=B[i];
            m++;
        }
    }
    for(i=0;i<la;i++)
    {
        int flag=1;
        for(j=0;j<lb;j++)
        {
            if(A[i]==B[j])
            {
                flag=0;
            }
        }
        if(flag==1)
        {
            D[n]=A[i];
            n++;
        }
    }
    printf("\n对称差集为:\n");
    for(k=0;k<m;k++)
    {
        if(C[k]==0)
        {
            break;
        }
        printf("%d   ",C[k]);
    }
    for(k=0;k<n;k++)
    {
        if(D[k]==0)
        {
            break;
        }
        printf("%d   ",D[k]);
    }
}

void buji(int A[],int U[],int la)
{
    int C[N]={0};
    int i,j,m,k;
    m=0;
    printf("集合A为:\n");
    for(i=0;i<la;i++)
    {
        printf("%d   ",A[i]);
    }
    for(i=0;i<20;i++)
    {
        int flag=1;
        for(j=0;j<la;j++)
        {
            if(U[i]==A[j])
            {
                flag=0;
            }
        }
        if(flag==1)
        {
            C[m]=U[i];
            m++;
        }
    }
    printf("\n补集为~A:\n");
    for(k=0;k<m;k++)
    {
        if(C[k]==0)
        {
            break;
        }
        printf("%d   ",C[k]);
    }
}
int main()
{
    int n1,n2,k;
    n1=0;
    n2=0;
    k=0;
    int A[N],B[N];
    int U[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
    printf("全集U为:");
    for(k=0;k<N;k++)
    {
        if(U[k]==0)
        {
            break;
        }
        printf("%d   ",U[k]);
    }
    printf("\n请输入第一个集合\n注意:输入0即为结束输入\n");
    while(1)
    {
        scanf("%d",&A[n1]);
        if(A[n1]==0)
            break;
        //printf("第一个集合为:%d\n",A[n1]);
        n1++;
    }
    printf("请输入第二个集合\n注意:输入0即为结束输入\n");
    while(1)
    {
        scanf("%d",&B[n2]);
        if(B[n2]==0)
            break;
        //printf("第二个集合为:%d\n",B[n2]);
        n2++;
    }
    int key=0;
    printf("请输入要进行的操作\n1为并集\n2为交集\n3为差集\n4为对称差\n5为补集\n");
    scanf("%d",&key);
    switch(key)
    {
    case 1:
        bingji(A,B,n1,n2);
        break;
    case 2:
        jiaoji(A,B,n1,n2);
        break;
    case 3:
        chaji(A,B,n1,n2);
        break;
    case 4:
        duichencha(A,B,n1,n2);
        break;
    case 5:
        buji(A,U,n1);
        break;

    }

}

(3)主函数

思路:给出全集,让用户自己输入子集A和B,并且通过循环到最后一个数为0停止知道子集A和B的长度,调用switch语句让用户自己选择需要计算的操作

int main()
{
    int n1,n2,k;
    n1=0;
    n2=0;
    k=0;
    int A[N],B[N];
    int U[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
    printf("全集U为:");
    for(k=0;k<N;k++)
    {
        if(U[k]==0)
        {
            break;
        }
        printf("%d   ",U[k]);
    }
    printf("\n请输入第一个集合\n注意:输入0即为结束输入\n");
    while(1)
    {
        scanf("%d",&A[n1]);
        if(A[n1]==0)
            break;
        //printf("第一个集合为:%d\n",A[n1]);
        n1++;
    }
    printf("请输入第二个集合\n注意:输入0即为结束输入\n");
    while(1)
    {
        scanf("%d",&B[n2]);
        if(B[n2]==0)
            break;
        //printf("第二个集合为:%d\n",B[n2]);
        n2++;
    }
    int key=0;
    printf("请输入要进行的操作\n1为并集\n2为交集\n3为差集\n4为对称差\n5为补集\n");
    scanf("%d",&key);
    switch(key)
    {
    case 1:
        bingji(A,B,n1,n2);
        break;
    case 2:
        jiaoji(A,B,n1,n2);
        break;
    case 3:
        chaji(A,B,n1,n2);
        break;
    case 4:
        duichencha(A,B,n1,n2);
        break;
    case 5:
        buji(A,U,n1);
        break;

    }

}

(4)并集

思路:首先显示集合A和集合B,其次先让集合A中的所有元素存入空数组C中,然后循环比较A和B有哪一个不同的元素,不同的元素就存入C中,最后输出C

void bingji(int A[],int B[],int la,int lb)
{
    int C[N]={0};
    int i,j,m,k;
    printf("集合A为:\n");
    for(i=0;i<la;i++)
    {
        printf("%d   ",A[i]);
    }
    printf("\n集合B为:\n");
    for(j=0;j<lb;j++)
    {
        printf("%d   ",B[j]);
    }
    for(m=0;m<la;m++)
    {
        C[m]=A[m];
    }
    for(i=0;i<lb;i++)
    {
        int flag=0;
        for(j=0;j<la;j++)
        {
            if(B[i]==A[j])
            {
                flag=1;
            }
        }
        if(flag==0)
        {
            C[m]=B[i];
            m++;
        }
    }
    printf("\n并集为:\n");
    for(k=0;k<(la+lb);k++)
    {
        if(C[k]==0)
        {
            break;
        }
        printf("%d   ",C[k]);
    }
}

(5)交集

思路:显示出集合A和B,当A和B都相等共有时,存入C中,然后输出

void jiaoji(int A[],int B[],int la,int lb)
{
    int C[N]={0};
    int i,j,m,k;
    m=0;
    printf("集合A为:\n");
    for(i=0;i<la;i++)
    {
        printf("%d   ",A[i]);
    }
    printf("\n集合B为:\n");
    for(j=0;j<lb;j++)
    {
        printf("%d   ",B[j]);
    }
    for(i=0;i<lb;i++)
    {
        int flag=1;
        for(j=0;j<la;j++)
        {
            if(B[i]==A[j])
            {
                flag=0;
            }
        }
        if(flag==0)
        {
            C[m]=B[i];
            m++;
        }
    }
    printf("\n交集为:\n");
    for(k=0;k<m;k++)
    {
        if(C[k]==0)
        {
            break;
        }
        printf("%d   ",C[k]);
    }
}

(6)差集

思路:从A开始循环比较,A和B不相等时,存入C中,得到A-B,如果要得到B-A,就从B开始循环比较

void chaji(int A[],int B[],int la,int lb)
{
    int C[N]={0};
    int i,j,m,k;
    m=0;
    printf("集合A为:\n");
    for(i=0;i<la;i++)
    {
        printf("%d   ",A[i]);
    }
    printf("\n集合B为:\n");
    for(j=0;j<lb;j++)
    {
        printf("%d   ",B[j]);
    }
    for(i=0;i<la;i++)
    {
        int flag=1;
        for(j=0;j<lb;j++)
        {
            if(B[i]==A[j])
            {
                flag=0;
            }
        }
        if(flag==1)
        {
            C[m]=A[i];
            m++;
        }
    }
    printf("\n差集为(A-B):\n");
    for(k=0;k<m;k++)
    {
        if(C[k]==0)
        {
            break;
        }
        printf("%d   ",C[k]);
    }
}

(7)对称差

思路:在A中,不在B中同时在B中,不在A中,所以用两个差集的思路即可

void duichencha(int A[],int B[],int la,int lb)
{
    int C[N]={0};
    int D[N]={0};
    int i,j,m,n,k;
    m=0;
    n=0;
    printf("集合A为:\n");
    for(i=0;i<la;i++)
    {
        printf("%d   ",A[i]);
    }
    printf("\n集合B为:\n");
    for(j=0;j<lb;j++)
    {
        printf("%d   ",B[j]);
    }
    for(i=0;i<lb;i++)
    {
        int flag=1;
        for(j=0;j<la;j++)
        {
            if(B[i]==A[j])
            {
                flag=0;
            }
        }
        if(flag==1)
        {
            C[m]=B[i];
            m++;
        }
    }
    for(i=0;i<la;i++)
    {
        int flag=1;
        for(j=0;j<lb;j++)
        {
            if(A[i]==B[j])
            {
                flag=0;
            }
        }
        if(flag==1)
        {
            D[n]=A[i];
            n++;
        }
    }
    printf("\n对称差集为:\n");
    for(k=0;k<m;k++)
    {
        if(C[k]==0)
        {
            break;
        }
        printf("%d   ",C[k]);
    }
    for(k=0;k<n;k++)
    {
        if(D[k]==0)
        {
            break;
        }
        printf("%d   ",D[k]);
    }
}

(8)补集

思路:在全集U中做循环比较A中只要没有,就存入C中,然后输出即可得出~A,~B思路也是如此

void buji(int A[],int U[],int la)
{
    int C[N]={0};
    int i,j,m,k;
    m=0;
    printf("集合A为:\n");
    for(i=0;i<la;i++)
    {
        printf("%d   ",A[i]);
    }
    for(i=0;i<20;i++)
    {
        int flag=1;
        for(j=0;j<la;j++)
        {
            if(U[i]==A[j])
            {
                flag=0;
            }
        }
        if(flag==1)
        {
            C[m]=U[i];
            m++;
        }
    }
    printf("\n补集为~A:\n");
    for(k=0;k<m;k++)
    {
        if(C[k]==0)
        {
            break;
        }
        printf("%d   ",C[k]);
    }
}

算法参考

CSDN博主Kilig*
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值