C语言 · 集合运算

算法训练 集合运算  
时间限制: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("
");
77     showbing(all,lena+lenb);//求并集 
78     printf("
");
79     showyu(a,b);//求余集
80     return 0;
81 }
原文地址:https://www.cnblogs.com/panweiwei/p/6603555.html