C语言 · 集合运算

时间:2022-03-28 02:14:47
算法训练 集合运算  
时间限制: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
 
 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("\n");
77 showbing(all,lena+lenb);//求并集
78 printf("\n");
79 showyu(a,b);//求余集
80 return 0;
81 }