作者: Turbo时间限制: 1S章节: 基本练习(数组)
问题描述 :
给出两个整数集合A、B,求出他们的交集、并集以及B在A中的余集。
输入说明 :
第一行为一个整数n,表示集合A中的元素个数。
第二行有n个互不相同的用空格隔开的整数,表示集合A中的元素。
第三行为一个整数m,表示集合B中的元素个数。
第四行有m个互不相同的用空格隔开的整数,表示集合B中的元素。
集合中的所有元素均为int范围内的整数,1<=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>
#include<math.h>
#include<stdlib.h>
#include<time.h>
int cmp(const void*_a,const void*_b)
{
int *a=(int *)_a;
int *b=(int *)_b;
return *a-*b;
}
int isin(int a,int s[],int n)
{
int i;
int flag=0;
for(i=0;i<n;i++)
{
if(a==s[i])
{
flag=1;
break;
}
}
return flag;
}
int main()
{
int i,q=0,p=0,k=0,j;
int *a,*b;
int jiao[10000],bing[20000],cha[10000];
int m,n;
scanf("%d",&m);
a=(int *)malloc(sizeof(int)*m);
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&n);
b=(int *)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
{
scanf("%d",&b[i]);
}
qsort(a,m,sizeof(int),cmp);
qsort(b,n,sizeof(int),cmp);
for(i=0;i<m;i++)
{
if(isin(a[i],b,n))//如果a[i]在数组b中,填入交集
{
jiao[k]=a[i];
k++;
// printf("%d",a[i]);
}
else//如果不在,填入差集
{
cha[q]=a[i];
q++;
}
}
for(i=0,j=0;i<m&&j<n;)//这是数据结构中的一个小题
{
if(a[i]<b[j])
{
bing[p]=a[i];
p++;
i++;
}
else if(a[i]>b[j])
{
bing[p]=b[j];
p++;
j++;
}
else
{
bing[p]=a[i];
j++;
p++;
i++;
}
}
while(i<m)
{
bing[p]=a[i];
p++;
i++;
}
while(j<n)
{
bing[p]=b[j];
p++;
j++;
}
if(k>0)
{
for(i=0;i<k;i++)
{
printf("%d ",jiao[i]);
}
printf("\n");
}
if(p>0)
{
for(i=0;i<p;i++)
{
printf("%d ",bing[i]);
}
printf("\n");
}
if(q>0)
{
for(i=0;i<q;i++)
{
printf("%d ",cha[i]);
}
printf("\n");
}
return 0;
}