c语言题目:{A} + {B}

这是一个关于如何合并两个集合并进行排序的编程问题。博客内容详细介绍了处理步骤,包括取值、合并集合、排序、去除重复元素以及输出结果。提供的代码示例使用了冒泡排序和简单的逻辑来实现这一功能。

题目如下:

给你两个集合,要求{A} + {B}.
注:同一个集合中不会有两个相同的元素.

Input

每组输入数据分为三行,第一行有两个数字n,m(0<n,m<=10000),分别表示集合A和集合B的元素个数.后两行分别表示集合A和集合B.每个元素为不超出int范围的整数,每个元素之间有一个空格隔开.

Output:

针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开.

样例如下:

Sample Input
1 2
1
2 3
1 2
1
1 2

sample output

1 2 3
1 2

 按照题目,可以将过程大致分为五步:

1,取值;

2,用一个集合C表示A,B两个集合合并后的集合;

3,对集合C中元素进行排序;

4,除去集合C中的重复元素;

5,输出;

对于取值不多做介绍(scanf函数即可);

第二步,用一个集合表示A,B两个集合合并后的集合,可做以下操作:

        for(i=0;i<n;i++)//n为A的元素个数
		{
			scanf("%d",A.a[i]);
			sum[i]=A.a[i];
		}
		for(i=0;i<m;i++,k++)//m为B的元素个数
		{
			scanf("%d",A.b[i]);
			sum[k]=A.b[i];
		}

但可以看出用sum于两个循环中都有出现,不妨直接对sum进行赋值:

for(i=0;i<m+n;i++)
{
	scanf("%d",&a[i]);
}

第三步:排序(快排,冒泡均可)

这里用的是冒泡

for(i=0;i<m+n-1;i++)
{
	for(j=0;j<m+n-i-1;j++)
	{
	   if(a[j]>a[j+1])
	   {
		   t=a[j];
		   a[j]=a[j+1];
		   a[j+1]=t;
		}
    }
}

第四步;除去重复元素:

for(i=0;i<n+m;i++)//两个集合中每个元素出现次数最大为2;
{
	if(a[i]==a[i+1])
	{
	   a[i+1]=0;//将重复第二次的元素赋值为0;
	}
}

第五步:输出

printf("%d",a[0]);
for(i=1;i<n+m;i++)
{
   if(a[i]!=0)
   {
	 printf(" %d",a[i]);//最后一个元素后无空格,所以可以先输出a[0],再在其他元素前添加空格
   }
}
printf("\n");//注意最后要换行,否则会报各式错误;

以上就是完整过程啦,整个代码如下:

#include<stdio.h>
int main()
{
	int i,j,n,m,t=0;
	int a[20001];
	while(scanf("%d %d",&n,&m)!= EOF)
	{  
		for(i=0;i<m+n;i++)
		{
			scanf("%d",&a[i]);
		}
		for(i=0;i<m+n-1;i++)
		{
			for(j=0;j<m+n-i-1;j++)
			{
				if(a[j]>a[j+1])
				{
					t=a[j];
				    a[j]=a[j+1];
					a[j+1]=t;
				}
			}
		}
		for(i=0;i<n+m;i++)
		{
			if(a[i]==a[i+1])
			{
				a[i+1]=0;
			}
		}
		printf("%d",a[0]);
		for(i=1;i<n+m;i++)
		{
			if(a[i]!=0)
			{
				printf(" %d",a[i]);
			}
		}
		printf("\n");
	}
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值