C语言编程练习20:计算合并

题目描述

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

输入

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

输出

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

样例输入 Copy

1 2
1
2 3
1 2
1
1 2

样例输出 Copy

1 2 3
1 2


思路:其实就是一道数组合并去重并排序,先把A、B两个数组分别排序,然后开一个新的数组C用来存放合并后的数组。
比较A、B两个数组每个元素的大小,小的放入新的数组C,若相等则选择A、B任意一个数组的元素放入新数组C。比较完后
把A或者B剩余的元素依次放入C。
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
	int n,m;
	
	while((scanf("%d %d",&n,&m))!= EOF)
	{
		int *a = (int *)malloc(sizeof(int)*n);
		int *b = (int *)malloc(sizeof(int)*m);
		int *c = (int *)malloc(sizeof(int)*(m+n));
		for(int t = 0; t<n;t++)
		{
			scanf("%d",&a[t]);
		}
		sort(a,a+n);//排序
		for(int t = 0; t<m;t++)
		{
			scanf("%d",&b[t]);
		}
		sort(b,b+m);//排序
		int i=0,j=0,k=0,cnt=0;//cnt记录元素个数
		while(i<n&&j<m)//把元素从小到大依次放入数组C
		{
			if(a[i]<b[j])
			{
				c[k++]=a[i];
				i++;
				cnt++;
			}
			if(b[j]<a[i])
			{
				c[k++] = b[j];
				j++;
				cnt++;
			}
			if(a[i]==b[j])
			{
				c[k++]=a[i];
				i++;
				j++;
				cnt++;
			}
		}
		if(i==n)//把B中的剩余元素放入C
		{
			for(int t=j;t<m;t++)
			{
				c[k++]=b[t];
				cnt++;
			}
		}
		if(j==m)//把A中的剩余元素放入C
		{
			for(int t=i;t<n;t++)
			{
				c[k++]=a[t];
				cnt++;
			}
		}
		for(int t = 0 ;t<cnt-1;t++)
		{
			printf("%d ",c[t]);
		}
		printf("%d\n",c[cnt-1]);
	}
    return 0;
}

 可以把合并有序数组单独写作一个函数merge

void Merge(int *a, int *b, int *c, int nA, int nB, int& nCout)
{
    int i = 0 ;
    int j = 0 ;
    int k = 0 ;
     
    while (i < nA && j < nB)
    {
        if (a[i] < b[j])// 如果a的元素小,则插入a中元素到c
        {
            c[k++] = a[i] ;
            ++i ;
            nCout++;
        }
        else if (a[i] == b[j])// 如果a和b元素相等,则插入二者皆可,这里插入a
        {
            c[k++] = a[i] ;
            ++i ;
            ++j ;
            nCout++;
        }
        else // a[i] > b[j] // 如果b中元素小,则插入b中元素到c
        {
            c[k++] = b[j] ;
            ++j ;
            nCout++;
        }
    }
     
    if (i == nA) // 若a遍历完毕,处理b中剩下的元素
    {
        for (int m = j; m < nB; ++m)
        {
            c[k++] = b[m] ;
            nCout++;
        }
    }
    else//j == n, 若b遍历完毕,处理a中剩下的元素
    {
        for (int m = i; m < nA; ++m)
        {
            c[k++] = a[m] ;
            nCout++;
        }
    }
}

 

 
posted @ 2021-01-23 12:53  FantasticDoulbeFish  阅读(366)  评论(0编辑  收藏  举报