• 集合运算


    问题描述
      给出两个整数集合A、B,求出他们的交集、并集以及B在A中的余集。
    输入格式
      第一行为一个整数n,表示集合A中的元素个数。
      第二行有n个互不相同的用空格隔开的整数,表示集合A中的元素。
      第三行为一个整数m,表示集合B中的元素个数。
      第四行有m个互不相同的用空格隔开的整数,表示集合B中的元素。
      集合中的所有元素均为int范围内的整数,n、m<=1000。
    输出格式
      第一行按从小到大的顺序输出A、B交集中的所有元素。
      第二行按从小到大的顺序输出A、B并集中的所有元素。
      第三行按从小到大的顺序输出B在A中的余集中的所有元素。
    样例输入
    5
    1 2 3 4 5
    5
    2 4 6 8 10
    样例输出
    2 4
    1 2 3 4 5 6 8 10
    1 3 5
    样例输入
    4
    1 2 3 4
    3
    5 6 7
    样例输出
    1 2 3 4 5 6 7
    1 2 3 4
    思路:用flag数组标记集合a与集合b相交的数在集合a中位置,在查找中,如果a[i]=b[j],flag标记为1,i、j分别自加,同时元素入并交Union集合,
    否则,小的数入并交集合,同时下标加1;当结束查找时,可能其中一个集合还有数未比较,作以下判断,i<n(集合a中元素个数),a集合剩下元素入Union集合,
    否则b集合中剩下元素入Union集合
    #include <iostream>
    #include <algorithm>
    int a[1000],b[1000];
    int Union[2001];//
    int flag[1000];//b与a交的数在a中下标的标记
    using namespace std;
    int main()
    {
        int n,m;
        int i,j,t;
        scanf("%d",&n);
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
        scanf("%d",&m);
        for(i=0;i<m;i++)
            scanf("%d",&b[i]);
        sort(a,a+n);
        sort(b,b+m);
        //确定交集、并集和余集
        t = i = j = 0;
        while(i < n && j < m)
        {
            if(a[i] < b[j])
            {
                Union[t++] = a[i];
                i ++;
            }
            else if(a[i] == b[j]){
                flag[i] = 1;//表示a中下标为i的数存在交集中
                Union[t++] = a[i];
                i ++;
                j ++;
            }
            else{
                Union[t++] = b[j];
                j ++;
            }
        }
        if(i<n)//剩下的并集的部分在集合a中,否则在b中
        {
            for(j=i;j<n;j++)
                Union[t++] = a[j];
        }
        else{
            for(i=j;i<m;i++)
                Union[t++] = b[i];
        }
        //输出交、并、余
        j = 0;
        for(i=0;i<n;i++)
            if(flag[i])
            {
                j ++;
                printf("%d ",a[i]);
            }
        if(j)//集合不为空才输出换行
            printf("
    ");
        for(i=0;i<t;i++)
            printf("%d ",Union[i]);
        printf("
    ");
        for(i=0;i<n;i++)
            if(!flag[i])
                printf("%d ",a[i]);
        printf("
    ");
        return 0;
    }
  • 相关阅读:
    计算机基础知识
    第三次作业函数
    c博客作业01顺序、分支结构
    C语言第02次作业循环结构
    c语言第0次作业
    JAVA在Eclipse里能运行,但是在cmd中却提示找不到主函数的错误【环境变量配置】
    MFC自定义消息机制步骤
    关于VC6.0界面MFC设置成XP风格问题【可以变得更加好看】
    VC6 下学习使用Teechart8记录 一 安装和熟悉teechart8【一个非常好的画图插件】
    Matlab中,让程序自动处理类似A1,A2,A3变量的方法。
  • 原文地址:https://www.cnblogs.com/emptyCoder/p/5136592.html
Copyright © 2020-2023  润新知