代码改变世界

C++学习的简单问题(三)

2013-04-09 00:23  liuzq2013  阅读(253)  评论(0)    收藏  举报
问题描述
  给出两个整数集合A、B,求出他们的交集、并集以及B在A中的余集。
输入格式
  第一行为一个整数n,表示集合A中的元素个数。   第二行有n个互不相同的用空格隔开的整数,表示集合A中的元素。   第三行为一个整数m,表示集合B中的元素个数。   第四行有m个互不相同的用空格隔开的整数,表示集合B中的元素。   集合中的所有元素均为int范围内的整数,n、m<=1000。
输出格式
  第一行按从小到大的顺序输出A、B交集中的所有元素。   第二行按从小到大的顺序输出A、B并集中的所有元素。   第三行按从小到大的顺序输出B在A中的余集中的所有元素。
#include <iostream>
using namespace std;
void bubbleSort(int* p,int n)
{
    int t=0;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n-i-1;j++)
        {
            if(*(p+j)>*(p+j+1))
            {
                t=*(p+j);
                *(p+j)=*(p+j+1);
                *(p+j+1)=t;
            }
        }
    }
}
void intersect(int* p,int n,int* q,int m)
{
    int* flag=new int[n];
    int count=0;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(*(q+j)==*(p+i))
            {
                count++;
                *(flag+i)=1;
            }
        }
    }
    int *pp=new int[count];
    int *pq=new int[m+n-count];
    int *qq=new int[n-count];
    count=0;
    int count2=0;
    for(int i=0;i<n;i++)
    {
        if(*(flag+i)==1)
        {
            *(pp+count)=*(p+i);
            count++;
        }
        else
        {
            *(qq+count2)=*(p+i);
            *(pq+count2)=*(p+i);
            count2++;
        }
    }
    for(int k=count2;k<m+n-count;k++)
    {
        *(pq+k)=*(q+k-count2);
    }
    bubbleSort(pp,count);
    bubbleSort(pq,m+n-count);
    bubbleSort(qq,count2);
    for(int i=0;i<count;i++)
    {
        cout<<*(pp+i)<<" ";
    }
    if(count!=0)
    {
        cout<<endl;
    }
    for(int i=0;i<m+n-count;i++)
    {
        cout<<*(pq+i)<<" ";
    }
    cout<<endl;
    for(int i=0;i<count2;i++)
    {
        cout<<*(qq+i)<<" ";
    }
    cout<<endl;
}
int main()
{
    int n,m;
    cin>>n;
    int *p=new int[n];
    for(int i=0;i<n;i++)
        cin>>*(p+i);
    cin>>m;
    int *q=new int[m];
    for(int j=0;j<m;j++)
        cin>>*(q+j);
    intersect(p,n,q,m);
    return 0;
}