算法训练 集合运算

问题描述

给出两个整数集合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

代码

#include <iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#include<math.h>
int a[1001];//数组a
int b[1001];//数组b
int c[1001];//交集数组
int d[1001];//并集数组
int e[1001];//补集数组
//冒泡排序
void Sort(int *a,int n)
{
    int i,j;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n-i;j++)
           if(a[j+1]<a[j])
             swap(a[j],a[j+1]);
}
//判断一个元素key是否在长度为blength的数组b中
int in(int *b,int blength,int key)
{
    for(int i=1;i<=blength;i++)
        if(key==b[i])
           return 1;
    return 0;//不在返回0
}
//求交集
int set_jiao(int n,int m)
{
      int length=0;
      if(n<=m){
          for(int i=1;i<=n;i++){//如果a的长度小于b,在b中遍历a[i]是否存在
              if(in(b,m,a[i])){
                    length++;
                    c[length]=a[i];
                 }
          }
      }else{//如果b的长度小于a,在a中遍历b[i]是否存在
        for(int i=1;i<=m;i++){
              if(in(a,n,b[i])){
                    length++;
                    c[length]=b[i];
                 }
          }
      }
      return length;//返回交集数组的长度
}
//求补集
int set_buji(int n,int m,int clength)
{
    //a-交集
    int elength=0;
    for(int i=1;i<=n;i++)
    {
        if(in(c,clength,a[i]))
            continue;
        e[++elength]=a[i];
    }
    return elength;
}
//求并集
int set_bingji(int n,int m)
{
    //b+补集
    int dlength=m+set_buji(n,m,set_jiao(n,m));
    for(int i=1;i<=m;i++)
        d[i]=b[i];
    int k=0;
    for(int i=m+1;i<=dlength;i++)
        d[i]=e[++k];
    Sort(d,dlength);
    return dlength;

}
//打印数组
void Print(int *a,int length)
{
    if(length==0)//如果数组长度为0,则不打印
        return ;
    for(int i=1;i<=length;i++)
        cout<<a[i]<<" ";
    cout<<endl;
}
int main()
{
	int n;cin>>n;//输入a数组的长度
	for(int i=1;i<=n;i++)
        cin>>a[i];//输入a[i]
    Sort(a,n);//使数组a升序
    int m;cin>>m;//输入b数组的长度
    for(int i=1;i<=m;i++)
        cin>>b[i];//输入b[i]
    Sort(b,m);//使b[i]有序
    int clength=set_jiao(n,m);//获得交集数组c的长度
    Print(c,clength);//打印交集数组c
    int dlength=set_bingji(n,m);//获得并集数组的长度
    Print(d,dlength);//打印并集数组
    Print(e,set_buji(n,m,clength));//打印补集数组
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值