问题描述
给出两个整数集合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 <stdio.h>
#define SIZE 1000
void quickSort(int a[], int left, int right)
{
if(left >= right) return;
int i, j, key;
i = left, j = right, key = a[left];
while(i < j){
while(i<j && a[j]>=key) j--;
a[i] = a[j];
while(i<j && a[i]<=key) i++;
a[j] = a[i];
}
a[i] = key;
quickSort(a, left, i-1);
quickSort(a, i+1, right);
}
void printIntersection(int a[], int b[], int n, int m)
{
int num[2*SIZE];
int i, j, tnum;
for(i=0; i<n; i++) num[i] = a[i];
for(j=0; j<m; j++) num[j+i] = b[j];
quickSort(num, 0, m+n-1);
tnum = num[0];
for(i=1; i<m+n; i++){
if(num[i] == tnum){
printf("%d ", tnum);
}
tnum = num[i];
}
printf("\n");
}
void printUnion(int a[], int b[], int n, int m)
{
int num[2*SIZE];
int i, j, tnum;
for(i=0; i<n; i++) num[i] = a[i];
for(j=0; j<m; j++) num[j+i] = b[j];
quickSort(num, 0, m+n-1);
tnum = num[0];
printf("%d ", tnum);
for(i=1; i<m+n; i++){
if(num[i] != tnum){
tnum = num[i];
printf("%d ", tnum);
}
}
printf("\n");
}
void printComplement(int a[], int b[], int n, int m)
{
int i, j;
j = 0;
quickSort(a, 0, n-1);
quickSort(b, 0, m-1);
for(i=0; i<m; i++){
while(j<n && a[j]<b[i]){
printf("%d ", a[j]);
j ++;
}
if(a[j] == b[i]) j++;
}
while(j < n){
printf("%d ", a[j]);
j ++;
}
printf("\n");
}
int main()
{
int i;
int n, m;
int a[SIZE]={0}, b[SIZE]={0};
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]);
}
printIntersection(a, b, n, m);
printUnion(a, b, n, m);
printComplement(a, b, n, m);
return 0;
}