算法训练 集合运算
时间限制:1.0s 内存限制:512.0MB
问题描述
给出两个整数集合A、B,求出他们的交集、并集以及B在A中的余集。
输入格式
第一行为一个整数n,表示集合A中的元素个数。
第二行有n个互不相同的用空格隔开的整数,表示集合A中的元素。
第三行为一个整数m,表示集合B中的元素个数。
第四行有m个互不相同的用空格隔开的整数,表示集合B中的元素。
集合中的所有元素均为int范围内的整数,n、m<=1000。
第二行有n个互不相同的用空格隔开的整数,表示集合A中的元素。
第三行为一个整数m,表示集合B中的元素个数。
第四行有m个互不相同的用空格隔开的整数,表示集合B中的元素。
集合中的所有元素均为int范围内的整数,n、m<=1000。
输出格式
第一行按从小到大的顺序输出A、B交集中的所有元素。
第二行按从小到大的顺序输出A、B并集中的所有元素。
第三行按从小到大的顺序输出B在A中的余集中的所有元素。
第二行按从小到大的顺序输出A、B并集中的所有元素。
第三行按从小到大的顺序输出B在A中的余集中的所有元素。
样例输入
5
1 2 3 4 5
5
2 4 6 8 10
1 2 3 4 5
5
2 4 6 8 10
样例输出
2 4
1 2 3 4 5 6 8 10
1 3 5
1 2 3 4 5 6 8 10
1 3 5
样例输入
4
1 2 3 4
3
5 6 7
1 2 3 4
3
5 6 7
样例输出
1 2 3 4 5 6 7
1 2 3 4
1 2 3 4
1 /* 2 B在A中的余集:表示A中有B中没有的元素。 3 */ 4 #include<stdio.h> 5 #include<string.h> 6 #define max 1000 7 int jiao[max]={0},bing[max+max]={0},yu[max]={0},all[max+max]={0};//分别表交集、并集、余集、和集 8 int lena,lenb;//a和b数组的长度 9 void MPup(int a[],int len){//冒泡升序 10 for(int i=0; i<len-1; i++){ 11 for(int j=0; j<len-1-i; j++){ 12 if(a[j]>a[j+1]){ 13 int t = a[j]; 14 a[j] = a[j+1]; 15 a[j+1] = t; 16 } 17 } 18 } 19 } 20 void showjiao(int all[],int len){ 21 int index=0;//下标 22 for(int i=0;i<len;i++){ 23 if(all[i+1] == all[i]){//如果当前遍历的元素和前一个元素相等 24 jiao[index++] = all[i];//存到bing中 25 } 26 } 27 for(int i=0;i<index;i++){ 28 printf("%d ",jiao[i]); 29 } 30 } 31 void showbing(int all[],int len){//求并集 32 int index=1;//下标 33 bing[0] = all[0]; 34 for(int i=1;i<len;i++){ 35 if(all[i] != all[i-1]){//如果当前遍历的元素和前一个元素不相等 36 bing[index++] = all[i];//存到bing中 37 } 38 } 39 for(int i=0;i<index;i++){ 40 printf("%d ",bing[i]); 41 } 42 } 43 void showyu(int a[],int b[]){ 44 int index=0;//表索引 45 for(int i=0;i<lena;i++) 46 { 47 int count=0; 48 for(int j=0;j<lenb;j++) 49 if(a[i]!=b[j]) 50 count++; 51 if(count==lenb) 52 yu[index++]=a[i]; 53 } 54 55 for(int i=0;i<index;i++){ 56 printf("%d ",yu[i]); 57 } 58 } 59 int main(){ 60 scanf("%d",&lena); 61 int a[lena]; 62 for(int i=0;i<lena;i++){ 63 scanf("%d",&a[i]); 64 all[i]=a[i]; 65 } 66 MPup(a,lena);//a排序 67 scanf("%d",&lenb); 68 int b[lenb]; 69 for(int i=0;i<lenb;i++){ 70 scanf("%d",&b[i]); 71 all[lena+i]=b[i]; 72 } 73 MPup(b,lenb);//b排序 74 MPup(all,lena+lenb);//和集排序 75 showjiao(all,lena+lenb);//求交集 76 printf(" "); 77 showbing(all,lena+lenb);//求并集 78 printf(" "); 79 showyu(a,b);//求余集 80 return 0; 81 }