小水题,杭电2034,人见人爱A-B

 1 /***** HDOJ 2034 人间人爱A-B题 ********/
 2 
 3 /******** written by C_Shit_Hu ************/
 4 
 5 /****************************************************************************/
 6 /* 
 7     首先表示,这一题不是很水。。。至少比那个人见人爱的A+B,高级点。。。。
 8 
 9     By the way :科普一下集合的减法
10     百度:
11     如集合A{1.2.3}   集合B{1.4.7}做减法运算的步骤和减法的结果为---->
12     -----其差是:以属于A而不属于B的元素为元素的集合称为A与B的差(集)A-B={2,3}
13 
14     A-B求的是两个集合的差,就是做集合的减法运算。
15 
16     每组输入数据占1行,每行数据的开始是2个整数n(0<=n<=100)和m(0<=m<=100),分别表示集合A和集合B的元素个数;
17     然后紧跟着n+m个元素--
18     ----前面n个元素属于集合A,其余的属于集合B. 每个元素为不超出int范围的整数,元素之间有一个空格隔开。
19     如果n=0并且m=0表示输入的结束,不做处理。
20   
21     针对每组数据输出一行数据,表示A-B的结果,如果结果为空集合,则输出“NULL”;
22     否则从小到大输出结果,为了简化问题,每个元素后面跟一个空格。
23 */
24 /****************************************************************************/
25 
26 // 代码如下。。。。。表示还不是很水。
27 
28 #include <stdio.h>
29 
30 int main()
31 {
32     int n,m;              // 定义变量,含义如题
33 
34     while(scanf("%d%d",&n,&m)!=EOF&&!(n==0&&m==0))     // 输入语句,多个测试实例,且以0,0结束。
35     {
36         int i,j,t;                  // 此处的临时变量,i, j为循环变量,t为临时存储数据变量
37         int flag=0;                 // 标识变量
38         int a[101],b[101];          // a[]; b[]; 为存储两个集合的整型数组
39         int c[101]={0};             // c[]; 为用于存储集合的差的数组,此处的初始化,用memset(); 函数更合适和恰当。。
40         for(i=0;i<n;i++)  
41             scanf("%d",&a[i]);
42         for(i=0;i<m;i++)
43             scanf("%d",&b[i]);      // 从标准输入读入两个集合,并存入对应的的数组中
44 
45         // 由于要求输出结果为从大到小,所以对A数组进行排序,用冒泡排序也可以。。。
46         for(i=1;i<n;i++)       
47         {
48             t=a[i];
49             for(j=i;j>0;j--)
50             {
51                 if(t<a[j-1])                    
52                     a[j]=a[j-1];    
53                 else
54                     break;
55             }
56             a[j]=t;
57         } 
58         
59         for(i=0;i<n;i++)
60         {
61             for(j=0;j<m;j++)
62                 if(a[i]==b[j])
63                     break;
64                 if(j>=m)
65                     c[flag++]=a[i];
66         }                        // 用已经排好序的A数组的元素逐个与B数组的元素比较,
67                                  // 如有相等的,则是标致变量加一, 并将相等的数组元素存入数组C中
68 
69         if(flag==0)
70             printf("NULL");
71         else
72         {
73             for(i=0;i<flag;i++)
74                 printf("%d ",c[i]);       // 注意,此处不需要注意最后的末尾是否不含有空格,题目已经解释含有空格
75         }                       // 依据标识变量的值输出结果,NULL或者数组C。
76         printf("\n");        
77     }
78 
79     return 0;
80 }
81 
82 
83 /******************************************************/
84 /********************  心得体会  **********************/
85 /*
86     这道题目,除去集合的减法不知道外,其实还是蛮简单的。。
87     也就是水。。。。
88     只要把第一个数组排好序,然后依次找出两个数组中的相同的元素就可以了。
89     本代码用到的一个标示变量,这是一个需要谨记的技巧。
90         
91     标识变量在本代码中的作用:
92     ①标示集合的减法结果是否为空
93     ②如不为空,则当做集合减法存放在数组的索引变量。
94 
95     水水更健康!!!
96 */
97 /******************************************************/

 

posted @ 2013-09-06 21:52  SuooL  阅读(322)  评论(0编辑  收藏  举报