水的不太彻底,HDOJ,杭电2034,人见人爱A-B。

/***** HDOJ 2034 人间人爱A-B题 ********/

/******** written by C_Shit_Hu ************/

/****************************************************************************/
/* 
	首先表示,这一题不是很水。。。至少比那个人见人爱的A+B,高级点。。。。

    By the way :科普一下集合的减法
	百度:
    如集合A{1.2.3}   集合B{1.4.7}做减法运算的步骤和减法的结果为---->
    -----其差是:以属于A而不属于B的元素为元素的集合称为A与B的差(集)A-B={2,3}

	A-B求的是两个集合的差,就是做集合的减法运算。

    每组输入数据占1行,每行数据的开始是2个整数n(0<=n<=100)和m(0<=m<=100),分别表示集合A和集合B的元素个数;
    然后紧跟着n+m个元素--
    ----前面n个元素属于集合A,其余的属于集合B. 每个元素为不超出int范围的整数,元素之间有一个空格隔开。
    如果n=0并且m=0表示输入的结束,不做处理。
  
	针对每组数据输出一行数据,表示A-B的结果,如果结果为空集合,则输出“NULL”;
	否则从小到大输出结果,为了简化问题,每个元素后面跟一个空格。
*/
/****************************************************************************/

// 代码如下。。。。。表示还不是很水。

#include <stdio.h>

int main()
{
	int n,m;              // 定义变量,含义如题

	while(scanf("%d%d",&n,&m)!=EOF&&!(n==0&&m==0))     // 输入语句,多个测试实例,且以0,0结束。
	{
		int i,j,t;                  // 此处的临时变量,i, j为循环变量,t为临时存储数据变量
		int flag=0;                 // 标识变量
		int a[101],b[101];          // a[]; b[]; 为存储两个集合的整型数组
		int c[101]={0};             // c[]; 为用于存储集合的差的数组,此处的初始化,用memset(); 函数更合适和恰当。。
		for(i=0;i<n;i++)  
			scanf("%d",&a[i]);
		for(i=0;i<m;i++)
			scanf("%d",&b[i]);      // 从标准输入读入两个集合,并存入对应的的数组中

	    // 由于要求输出结果为从大到小,所以对A数组进行排序,用冒泡排序也可以。。。
		for(i=1;i<n;i++)       
		{
			t=a[i];
			for(j=i;j>0;j--)
			{
				if(t<a[j-1])                    
					a[j]=a[j-1];    
				else
					break;
			}
			a[j]=t;
		} 
		
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
				if(a[i]==b[j])
					break;
				if(j>=m)
					c[flag++]=a[i];
		}                        // 用已经排好序的A数组的元素逐个与B数组的元素比较,
		                         // 如有相等的,则是标致变量加一, 并将相等的数组元素存入数组C中

		if(flag==0)
			printf("NULL");
		else
		{
			for(i=0;i<flag;i++)
				printf("%d ",c[i]);       // 注意,此处不需要注意最后的末尾是否不含有空格,题目已经解释含有空格
		}                       // 依据标识变量的值输出结果,NULL或者数组C。
		printf("\n");		
	}

	return 0;
}


/******************************************************/
/********************  心得体会  **********************/
/*
    这道题目,除去集合的减法不知道外,其实还是蛮简单的。。
	也就是水。。。。
	只要把第一个数组排好序,然后依次找出两个数组中的相同的元素就可以了。
	本代码用到的一个标示变量,这是一个需要谨记的技巧。
        
    标识变量在本代码中的作用:
	①标示集合的减法结果是否为空
	②如不为空,则当做集合减法存放在数组的索引变量。

	水水更健康!!!
*/
/******************************************************/

你可能感兴趣的:(水的不太彻底,HDOJ,杭电2034,人见人爱A-B。)