集合の問題

2453 ワード

タイトルの説明
2つの線形テーブルLAとLBがそれぞれ2つの集合AとB(すなわち、線形テーブルのデータ要素は集合のメンバーである)を表すと仮定し、新しい集合A=A≦Bが要求される.これは、線形テーブルLAを拡大し、線形テーブルLBに存在し、線形テーブルLAに存在しないデータ要素を線形テーブルLAに挿入する操作を必要とする.線形テーブルLBから各要素を順次取得し、値に応じて線形テーブルLAにおいてルックアップを行い、存在しなければ挿入する.上記の操作手順は、以下のアルゴリズムで説明することができる.
 
図:二つのリストを結合するアルゴリズム(C/C++説明)
上図のアルゴリズムでは、8行目に集合Bの要素を取得し、10行目に集合Aに挿入する.あなたのタスクは、まず集合Aと集合Bの要素を出力し、各集合は1行で出力します.次に、集合Aの末尾に挿入された要素を集合Bの要素から取り出すたびに、集合Aの要素が出力される.もちろん、あなたのコードは上のコードとは違ってもいいです.同じ出力があればいいです.
入力
複数のテストデータがあり、各テストデータが2行を占めています.1行目は集合Aであり、1番目の整数m(0しゅつりょく
各テストデータのセットはn+2行を出力する:前の2行はそれぞれ集合A、集合Bのデータを出力し、後のn行はBから要素を取り出してAの末尾に挿入した後の集合Aである.各行の整数間はスペースで区切られ、各テストデータ間は1行の空白行で区切られます.
サンプル入力
5 1 5 2 6 33 1 7 91 32 2 74 2 5 1 44 1 2 4 5
サンプル出力
1 5 2 6 31 7 91 5 2 6 31 5 2 6 3 71 5 2 6 3 7 932 73 23 2 72 5 1 41 2 4 52 5 1 42 5 1 42 5 1 42 5 1 4
チェーン時計が下手で面倒くさいので配列で作りました
#include<stdio.h>
#include<string.h>

int a[100000],b[100000];

int main(){
    int i,j;
    int m,n;
    while(~scanf("%d",&m)){
        memset(a,'\0',sizeof(a));
        memset(b,'\0',sizeof(b));
        for(i=0;i<m;i++){
            scanf("%d",&a[i]);
        }
        scanf("%d",&n);
        for(i=0;i<n;i++){
            scanf("%d",&b[i]);
        }
        for(i=0;i<m-1;i++){
            printf("%d ",a[i]);
        }
        printf("%d
",a[m-1]); for(i=0;i<n-1;i++){ printf("%d ",b[i]); } printf("%d
",b[n-1]); int flag; int ans=0; for(i=0;i<n;i++){ flag=1; for(j=0;j<m+ans;j++){ if(b[i]==a[j]){ flag=0; break; } } if(flag==1){ ans++; a[m-1+ans]=b[i]; } for(j=0;j<m-1+ans;j++){ printf("%d ",a[j]); } printf("%d
",a[m-1+ans]); } printf("
"); } return 0; }