资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
给出两个整数集合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
思路:输入a[],b[],并对其进行升序,在依次求交集,并集,余集,用函数操作更加容易理解。
**代码如下:**
/*
问题:求两个集合的交集,并集,和b在a中的余集
*/
#include <iostream>
#include <algorithm>
int a[2001],b[2001],c[4002],d[2001],e[2001];
using namespace std;
int jiaoji(int n,int m){
int i,j,k = 0;
for(i = 0;i < n;i++){
for(j = 0;j < m;j++){
if(a[i] == b[j]){ //相等的时候输出,相等的值,并把这个数据赋给d[]
d[k++] = a[i];
cout << a[i] << " ";
}
}
}
return k;
}
void bingji(int j){
//输出c集合中的单一元素
// 1 2 3 1 2
// 1 1 2 2 3
sort(c,c+j); //升序
int p,i;
for(i = 0;i < j;i++){
if(c[i] == c[i+1]){
cout << c[i] << " ";
i++;
}else{
cout << c[i] << " ";
}
}
}
// 1 2 3 4 5 除去2 4 输出 1 3 5
void yuji(int n,int k){ //按从小到大的顺序输出a集合里面除d集合的元素
int i,j,flag;
if(k == 0){
for(i = 0;i < n;i++){
cout << a[i] << " ";
}
}
else{
for(i = 0;i < n;i++){
//int flag = 1;
for(j = 0;j < k;j++){
if(a[i] != d[j]){
flag = 1; //判断a[]不是交集里面的数据
}else{
flag = 0; //判断a[]是交集里面的数据
break;
}
}
if(flag){
cout << a[i] << " ";
}
}
}
}
int main(){
int n,m; //n表示a集合的整数个数,m代表b集合的整数个数
int i,j;
//输入a[]b[] 并对a[]b[]进行升序排列
cin >> n;
for(i = 0;i < n;i++){
cin >> a[i];
}
cin >> m;
for(i = 0;i < m;i++){
cin >> b[i];
}
sort(a,a+n);
sort(b,b+m);
//求交集
//int max = n > m ? n : m;
int k = jiaoji(n,m);
printf("\n");
//求并集按升序输出
//两个集合合并到一个集合进行操作
j = 0;
for(i = 0;i < n;i++){
c[j++] = a[i];
}
for(i = 0;i < m;i++){
c[j++] = b[i];
}
bingji(j);
printf("\n"); //换行
yuji(n,k);
return 0;
}