集合运算

给出两个整数集合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

思路
先对输入进来的数组进行排序;
交集:在排好序的两个数组a[],b[]中,做循环,寻找两个数组当中相等的两个数,然后将相等的数输出。因为是排好序的,可以第一个到最后一个数比较,若a[i]=b[j]则输出a[i],若a[i]<b[j] 则i++,反之则j++。
并集:创建一个新的数组用来存放a[]和b[]的并集。在排号序的a[],b[]两个数组中做循环,若a[i]=b[j],则将a[i]存进c[]中;若a[i]>b[j]则将b[j]存进数组c[]中;反之则将a[i]存进数组中。若a[]数组长度大于b[]则将a[]剩余的数都存进c[]中。b[]同理。
#include<stdio.h>
#define MAXN 1001
int n,m;
void SelectSort(int a[],int length){

int i,j,temp,min;
for(i=0;i<length-1;i++){
min=i;
for(j=i+1;j<length;j++){
if( a[j]<a[min] )
min=j;
}
if( min!=i ){
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
}

void jiaoji(int a[],int b[],int lena,int lenb){
int i,j;
i=1;
j=1;
while(i<=lena&&j<=lenb){

	if(a[i]==b[i]){
		printf("%d",a[i]);
		j++;
		i++;
	}
	else if(a[i]<b[j])
			i++;
		else
			j++;
	}
printf("\n");

}

int bingji(int a[],int b[],int c[],int lena,int lenb){
int i,j,k;
i=1;
j=1;
k=1;
while(i<=lena&&j<=lenb){
if(a[i]<b[j]){
c[k]=a[i];
i++;
}
else if(a[i]>b[j]){
c[k]=b[j];
j++;
}
else{
c[k]=a[i];
i++;
j++;
}
k++;
}
if(i>lena){
while(j<=lenb){
c[k]=b[j];
j++;
k++;
}
}
else{
while(i<=lena){
c[k]=a[i];
i++;
k++;
}
}
return k;
}

void yuji(int a[],int b[],int lena,int lenb){
int i,j;
i=1;
j=1;
while(i<=lena&&j<=lenb){
if(a[i]==b[j]){
i++;
j++;
}
else if(a[i]<b[j]){
printf("%d",a[i]);
i++;
}
else
j++;
}
if(j>lenb){
while(i<=lena){
printf("%d",a[i]);
i++;
}
}
printf("\n");
}

int main(){
int i,l;
int a[MAXN],b[MAXN],c[2019];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
SelectSort(a,n);
scanf("%d",&m);
for(i=0;i<m;i++)
scanf("%d",&b[i]);
SelectSort(b,m);
jiaoji(a,b,n,m);
l=bingji(a,b,c,n,m);
for(i=0;i<l;i++)
printf("%d",c[i]);
printf("\n");
yuji(a,b,n,m);
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值