问题描述 给出两个整数集合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
解法.可以直接使用c++stl库简单快捷
此处,简单的实现了集合,用线性表结构
#include
#include
#include
#define size 300+10
int cmp(const void* p,const void * q){
int a=*((int*)p);
int b=*((int*)q);
return a>b;
}
int union_set(int s1[],int l1,int s2[],int l2,int s3[],int *l3){
int le1=0,le2=0,le3=0;
while(le1
if(s1[le1]
s3[le3++]=s1[le1++];
}else if(s1[le1]==s2[le2]){
s3[le3++]=s2[le2++];
le1++;
}else{
s3[le3++]=s2[le2++];
}
}
while(le1
s3[le3++]=s1[le1++];
}
while(le2
s3[le3++]=s2[le2++];
}
*l3=le3;
return le3;
}
void sub_set(int s1[],int l1,int s2[],int l2,int s3[],int *l3){
int le1=0;
int le2=0;
int le3=0;
while(le1
if(s1[le1]
le1++;
}else if(s1[le1]==s2[le2]){
s3[le3++]=s2[le2++];
le1++;
}else{
le2++;
}
}
*l3=le3;
}
int insert_set(int s[],int *l,int val){
int i=0;
for(i=*l-1;i>=-1;i--){
if(i==-1){
s[0]=val;
(*l)++;
return *l;
}
if(val
s[i+1]=s[i];
}else if(s[i]==val){
break;
}else{
s[i+1]=val;
(*l)++;
break;
}
}
return *l;
}
void different_set(int s1[],int l1,int s2[],int l2,int s3[],int* l3){
int le1=0;
int le2=0;
int le3=0;
while(le1
if(s1[le1]
s3[le3++]=s1[le1++];
}else if(s1[le1]==s2[le2]){
le1++;
le2++;
}else{
le2++;
}
}
while(le1
s3[le3++]=s1[le1++];
}
*l3=le3;
}
void show_set(int s[],int l){
int i;
qsort(s,l,sizeof(s[0]),cmp);
for(i=0;i
printf("%d ",s[i]);
}
if(l>0)
printf("\n");
}
int main(){
int s1[size];
int l1=0;
int s2[size];
int l2=0;
int s3[size];
int l3;
int i;
scanf("%d",&l1);
for(i=0;i
scanf("%d",&s1[i]);
scanf("%d",&l2);
for(i=0;i
scanf("%d",&s2[i]);
union_set(s1,l1,s2,l2,s3,&l3);
show_set(s3,l3);
sub_set(s1,l1,s2,l2,s3,&l3);
show_set(s3,l3);
different_set(s1,l1,s2,l2,s3,&l3);
show_set(s3,l3);
return 0;
}