问题描述 给出两个整数集合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
记:
一开始想用桶排序,结果发现在后面的测试数据中,既有大数据,也有负数
故改为正常数组存储,排序,但仍旧加入桶排序中的加点,便于输出题目所要的
AC代码:
1 #include <stdio.h> 2 #define LEN 2500 3 4 int n,m; 5 long long arr[LEN][2] = {0};/*0->存储数据,1->存储加点*/ 6 7 void sort_q(int x,int y,long long tmp[LEN][2]) 8 { 9 int i = x , j = y; 10 long long k[2]; 11 k[0] = tmp[x][0]; 12 k[1] = tmp[x][1]; 13 if (i < j) 14 { 15 while (i < j) 16 { 17 while (i < j && k[0] < tmp[j][0]) 18 j --; 19 if (i < j) 20 { 21 tmp[i][0] = tmp[j][0]; 22 tmp[i][1] = tmp[j][1]; 23 i ++; 24 } 25 while (i < j && k[0] > tmp[i][0]) 26 i ++; 27 if (i < j) 28 { 29 tmp[j][0] = tmp[i][0]; 30 tmp[j][1] = tmp[i][1]; 31 j --; 32 } 33 } 34 tmp[i][0] = k[0]; 35 tmp[i][1] = k[1]; 36 sort_q(x,i-1,tmp); 37 sort_q(i+1,y,tmp); 38 } 39 return ; 40 } 41 42 void init(void) 43 { 44 int flag; 45 int i,j; 46 long long k; 47 48 scanf("%d",&n); 49 for (i = 1 ; i <= n ; i ++) 50 { 51 scanf("%lld",&k); 52 arr[i][0] = k; 53 arr[i][1] += 1; 54 } 55 56 scanf("%d",&m); 57 for (i = n+1 ; i <= n+m ; i ++) 58 { 59 scanf("%lld",&k); 60 flag = 1; 61 for (j = 1 ; j <= n ; j ++) 62 { 63 if (arr[j][0] == k) 64 { 65 arr[j][1] += 2; 66 flag = 0; 67 break; 68 } 69 } 70 if (flag) 71 { 72 arr[i][0] = k; 73 arr[i][1] += 2; 74 } 75 } 76 sort_q(1,i,arr); /*快排*/ 77 return ; 78 } 79 80 void print() 81 { 82 int i; 83 for (i = 1 ; i <= LEN ; i ++) 84 { 85 if (arr[i][1] >= 3) 86 { 87 printf("%lld ",arr[i][0]);/*输出AB交集*/ 88 } 89 } 90 printf("\n"); 91 92 for (i = 1 ; i <= LEN ; i ++) 93 { 94 if (arr[i][1] != 0) 95 { 96 printf("%lld ",arr[i][0]);/*输出AB并集*/ 97 } 98 } 99 printf("\n"); 100 101 for (i = 1 ; i <= LEN ; i ++) 102 { 103 if (arr[i][1] == 1) 104 { 105 printf("%lld ",arr[i][0]);/*输出B在A中的余集*/ 106 } 107 } 108 109 return ; 110 } 111 112 int main(void) 113 { 114 init(); 115 print(); 116 return 0; 117 }