参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差,就是做集合的减法运算。(当然,大家都知道集合的定义,就是同一个集合中不会有两个相同的元素,这里还是提醒大家一下)
呵呵,很简单吧?
如果n=0并且m=0表示输入的结束,不做处理。
3 3 1 2 3 1 4 7 3 7 2 5 8 2 3 4 5 6 7 8 0 0
2 3 NULL
这个题整体思路比较简单,但处理起来会遇到麻烦。第一步输入数据是去掉数组中的重复元素,对比已经输入的每一个,如果有相同的元素给m和i各减1,这就是去掉重复元素。此时的m和n已经是经过优化的,然后执行A-B操作,对于A中的每一个元素,如果B中没有与之相同的就记下来存到目标数组里最后输出。这里边还用到了判断是否为空集的标记数来置于每组数据的开始,如果有元素赋值给目标数组它就会记下来,根据它来判断是否为空集。最后把得出的数组里的元素进行排序然后输出即可。
void
sort(int *c,int t)//排序{
int j,x,i;
for(i=0;i<t-1;i++)
{
for(j=i+1;j<t;j++)
{
if(c[j]<c[i])
{
x=c[i];
c[i]=c[j];
c[j]=x;
}
}
}
}
int
main()
{
int m,n,a[100],b[100],i=0,h=0,j=0,k,s[100],cnt=1;
while(scanf("%d%d",&m,&n),(m||n))
{
h=0;cnt=1;
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);
for(j=0;j<i;j++)//输入且去掉重复的元素
{
if(a[j]==a[i])
{
i--;m--;
}
}
}
for(i=0;i<n;i++)
{
scanf("%d",&b[i]);
for(j=0;j<i;j++)
{
if(b[j]==b[i])
{
i--;n--;
}
}
}
for(i=0;i<m;i++)
{
k=0;
for(j=0;j<n;j++)
{
if(a[i]==b[j])
{
k=1;
}
}
if(k==0)s[h]=a[i],h++,cnt=0;
}
sort(s,h);
if(cnt==1)printf("NULL");
else
for(i=0;i<h;i++)
{
printf("%d ",s[i]);
}
printf("\n");
}
return 0;
}