【ACM之旅】集合运算

来源:互联网 发布:oppo相机软件下载 编辑:程序博客网 时间:2024/05/29 10:35

一、[题目] 集合运算

时间限制: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


二、[代码]:

PS. 集合运算 是一道稍有难度的入门级数学类题目,解题的关键在于充分理解交集、并集与余集,从题目中所给的样例我们不难理解这三者,所以需要我们利用一定的算法将其输出,由于还需要将结果按从小到大输出,因此我们不防先对所有元素排序,再根据集合特点进行输出,以下列出我的解法。

算法一: 先行排序法(先排序,再取集)

#include <stdio.h>#include <stdlib.h>int cmp(const void *a, const void *b){  return *(int*)a-*(int*)b;}int main(){  int i,j,n,m,a[2000],b[1000];  scanf("%d",&i); n=i;  while(i--){    scanf("%d",&a[i]);  }  scanf("%d",&i); n+=m=i;  while(i--){    scanf("%d",&a[n-i-1]);    b[i]=a[n-i-1];  }  qsort(a,n,4,cmp); //对所有取得的数进行先行排序  i=0;  while(++i<n){ //取交集    if(a[i]==a[i-1]) printf("%d ",a[i]);  }  printf("\n",i=0);  while(++i<=n){ //取并集    if(a[i]!=a[i-1]) printf("%d ",a[i-1]);  }  printf("\n",i=0);  while(++i<=n){  //取余集    if(a[i]!=a[i-1]&&(i>1?a[i-1]!=a[i-2]:1)){      j=0; while(j<m&&a[i-1]!=b[j++]){}      if(a[i-1]!=b[j-1]) printf("%d ",a[i-1]);    }  }  return 0;}

欢迎评论和转载,转载请注明文章出处,我对此表示最真诚的敬意!
1 0
原创粉丝点击