算法训练 集合运算

来源:互联网 发布:圣人不出门知天下事 编辑:程序博客网 时间:2024/06/15 05:50


  算法训练 集合运算  
时间限制: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             


以前碰到这类题目,总是会跳过,是有点复杂,但是写出来并不是很难,这道题目要注意重复的情况,防止重复输出
说实话这样写的有点复杂了
后面粘上简化的更加明了的代码
                                                                                 
#include <cstdio>#include <algorithm>using namespace std;int main(){int len_a,len_b;int a[1010],b[1010];scanf("%d",&len_a);for(int i=0;i<len_a;i++){scanf("%d",&a[i]);}scanf("%d",&len_b);for(int i=0;i<len_b;i++){scanf("%d",&b[i]);}sort(a,a+len_a);sort(b,b+len_b);int flag=0,i,j;for(i=0,j=0;i<len_a&&j<len_b;i++){if(i>0&&a[i]==a[i-1]){continue;}while(1){if(a[i]==b[j]){if(flag==0){printf("%d",a[i]);    flag=1;}else{printf(" %d",a[i]);}j++;break;}else if(a[i]<b[j]){break;}else{j++;}}}printf("\n");flag=0;for(i=0,j=0;i<len_a&&j<len_b;i++){if(i>0&&a[i]==a[i-1]){continue;}while(1){if(a[i]==b[j]){if(flag==0){printf("%d",a[i]);    flag=1;}else{printf(" %d",a[i]);}j++;while(b[j]==b[j-1]){j++;}break;}else if(a[i]<b[j]){if(flag==0){printf("%d",a[i]);    flag=1;}else{printf(" %d",a[i]);}break;}else{if(flag==0){printf("%d",b[j]);    flag=1;}else{printf(" %d",b[j]);}j++;while(b[j]==b[j-1]){j++;}}}}while(j<len_b){if(flag==0){printf("%d",b[j]);flag=1;}else{printf(" %d",b[j]);}j++;while(b[j]==b[j-1]&&j<len_b){j++;}}while(i<len_a){if(flag==0){printf("%d",a[i]);flag=1;}else{printf(" %d",a[i]);}i++;while(a[i]==a[i-1]&&i<len_a){i++;}}printf("\n");flag=0;for(i=0,j=0;i<len_a&&j<len_b;i++)    {    if(i>0&&a[i]==a[i-1])    {    continue;    }    while(1)    {    if(a[i]==b[j])    {    break;    }    else if(a[i]<b[j])    {    if(flag==0)    {    printf("%d",a[i]);    flag=1;    break;    }    else    {    printf(" %d",a[i]);    break;    }    }    else    {    j++;    }    }    }    while(i<len_a)    {    if(flag==0)    {    printf("%d",a[i]);    flag=1;    }    else    {    printf(" %d",a[i]);    }    i++;    }    printf("\n");return 0;}

  好像也不是很简单
#include <cstdio>#include <algorithm>using namespace std;int main(){int len_a,len_b;int a[1010],b[1010];scanf("%d",&len_a);for(int i=0;i<len_a;i++){scanf("%d",&a[i]);}scanf("%d",&len_b);for(int i=0;i<len_b;i++){scanf("%d",&b[i]);}sort(a,a+len_a);sort(b,b+len_b);int flag=0,i=0,j=0;while(i<len_a&&j<len_b){while(i>0&&a[i]==a[i-1]&&i<len_a){i++;}while(j>0&&b[j]==b[j-1]&&j<len_b){j++;}if(a[i]==b[j]){if(flag==0){printf("%d",a[i]);    flag=1;}else{printf(" %d",a[i]);}    i++;j++;}else if(a[i]<b[j]){i++;}else{j++;}continue ;}printf("\n");flag=0;i=0;j=0;while(i<len_a&&j<len_b){if(i>0&&a[i]==a[i-1]&&i<len_a){i++;;}if(j>0&&b[j]==b[j-1]&&j<len_b){j++;;}if(a[i]==b[j]){if(flag==0){printf("%d",a[i]);    flag=1;}else{printf(" %d",a[i]);}i++;j++;}else if(a[i]<b[j]){if(flag==0){printf("%d",a[i]);    flag=1;}else{printf(" %d",a[i]);}i++;}else{if(flag==0){printf("%d",b[j]);    flag=1;}else{printf(" %d",b[j]);}j++;}continue ;}while(j<len_b){if(flag==0){printf("%d",b[j]);flag=1;}else{printf(" %d",b[j]);}j++;while(b[j]==b[j-1]&&j<len_b){j++;}}while(i<len_a){if(flag==0){printf("%d",a[i]);flag=1;}else{printf(" %d",a[i]);}i++;while(a[i]==a[i-1]&&i<len_a){i++;}}printf("\n");flag=0;i=0;j=0;while(i<len_a&&j<len_b)    {    if(i>0&&a[i]==a[i-1]&&i<len_a)    {    i++;    }    if(j>0&&b[j]==b[j-1]&&j<len_b)    {    j++;    }    if(a[i]==b[j])    {    i++;    }    else if(a[i]<b[j])    {    if(flag==0)    {    printf("%d",a[i]);    flag=1;    }    else    {    printf(" %d",a[i]);    }    i++;    }    else    {    j++;    }    continue;    }    while(i<len_a)    {    if(flag==0)    {    printf("%d",a[i]);    flag=1;    }    else    {    printf(" %d",a[i]);    }    i++;    }    printf("\n");return 0;}



0 0