问题描述
给出两个整数集合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;
}