Как собрать в третий массив различные элементы из двух массивов?

Даны два массива: А[M] и B[N] (M и N вводятся с клавиатуры). Необходимо создать третий массив минимально возможного размера, в котором нужно собрать элементы массивов A и B, которые не являются общими для них, без повторений. Третий массив собирается с косяками.

#include<iostream>
#include<time.h>
#include<stdlib.h>

using namespace std;



int main()
{
    setlocale(LC_ALL, "Rus");
    srand(time(NULL));

int size1 = 10;
    int size2 = 10;
    cout << " Введите размер первого массива " << endl;
    cin >> size1;

    cout << " Введите размер второго массива " << endl;
    cin >> size2;

    int *arr1 = new int[size1];
    int *arr2 = new int[size2];
    for (int i = 0; i < size1; i++)
    {
        arr1[i] = rand() % 10;
        cout << arr1[i] << " ";
    }
    cout << endl;
    for (int i = 0; i < size2; i++)
    {
        arr2[i] = rand() % 10;
        cout << arr2[i] << " ";
    }
    cout << endl;

    int tmp = 0;
    for (int i = 0; i < size1; i++)
    {
        for (int j = 0; j < size2; j++)
        {
            if (arr1[i] != arr2[j])
            {
                tmp++;
            }
        }
    }
    int size3 = tmp;
    int *arrtmp = new int[size3];
    tmp = 0;
    for (int i = 0; i < size1; i++)
    {
        for (int j = 0; j < size2; j++)
        {
            if (arr1[i] != arr2[j])
            {
                arrtmp[tmp] = arr2[j];
                tmp++;
            }
        }
    }
    int *arr3 = new int[size3];
    for (int i = 0; i < size3; i++)
    {
        arr3[i] = arrtmp[i];
        cout << arr3[i] << " ";
    }
    cout << endl;

    system("pause");
    return 0;
}

Ответы (1 шт):

Автор решения: S.H.

Прошу Вас обратить внимание на то, что фрагмент кода

int tmp = 0;
for (int i = 0; i < size1; i++)
{
    for (int j = 0; j < size2; j++)
    {
        if (arr1[i] != arr2[j])
        {
            tmp++;
        }
    }
}

к сожалению, просто не верен.

Вам нужно про каждый элемент первого массива проверить, не совпадает ли он хоть с каким то элементом второго масива.

Фактически, задача допускает несколько решений, довольно изящное - с использованием set, но, думаю, это пока выходит за рамки Вашего примера.

Попробуем переписать его, пользуясь только циклами.

Итак, для каждого числа из массива 1 нужно понять, входит ли оно в массив 2, и если не входит - поместить его в массив 3. И то же самое сделать с каждым элементом массива 2.

Код получается такой: (он длинный, и разными способами его можно сократить, но основную идею он демонстрирует)

    #include<iostream>
    #include<time.h>
    #include<stdlib.h>

    using namespace std;



    int main()
    {
        setlocale(LC_ALL, "Rus");
        srand(time(NULL));

        int size1 = 10;
        int size2 = 10;
        cout << " Введите размер первого массива " << endl;
        cin >> size1;

        cout << " Введите размер второго массива " << endl;
        cin >> size2;

        int *arr1 = new int[size1];
        int *arr2 = new int[size2];
        for (int i = 0; i < size1; i++)
        {
            arr1[i] = rand() % 10;
            cout << arr1[i] << " ";
        }
        cout << endl;
        for (int i = 0; i < size2; i++)
        {
            arr2[i] = rand() % 10;
            cout << arr2[i] << " ";
        }
        cout << endl;

        // первый этап.Здесь мы просто СЧИТАЕМ, сколько элементов нужно поместить в третий массив

        int tmp = 0;
        // сколько элементов из первого массива?
        for (int i = 0; i < size1; i++)
        {
            bool inBoth=false;
            for (int j = 0; j < size2; j++)
            {
                if (arr1[i] == arr2[j]){
                    inBoth=true;
                    break;
                }
            }
            if (!inBoth)
                tmp++;
        }

        // сколько элеметов из второго массива?
        for (int i = 0; i < size2; i++)
        {
            bool inBoth=false;
            for (int j = 0; j < size1; j++)
            {
                if (arr2[i] == arr1[j]){
                    inBoth=true;
                    break;
                }
            }
            if (!inBoth)
                tmp++;
        }

        int size3 = tmp;
        int *arr3 = new int[size3];
        tmp = 0;

        // второй этап. Те же самые циклы, но уже не считаем, азаписываем уникальные элементы в третий массив

        // помещаем в третий массив элементы из первого массива
        for (int i = 0; i < size1; i++)
        {
            bool inBoth=false;
            for (int j = 0; j < size2; j++)
            {
                if (arr1[i] == arr2[j]){
                    inBoth=true;
                    break;
                }
            }
            if (!inBoth)
                arr3[tmp++]=arr1[i];
        }

        // помещаем в третий массив элеметы из второго массива
        for (int i = 0; i < size2; i++)
        {
            bool inBoth=false;
            for (int j = 0; j < size1; j++)
            {
                if (arr2[i] == arr1[j]){
                    inBoth=true;
                    break;
                }
            }
            if (!inBoth)
                arr3[tmp++]=arr2[i];
        }

        // выводим
        for (int i = 0; i < size3; i++)
            cout << arr3[i] << " ";

        cout << endl;

        system("pause");
        return 0;
    }
→ Ссылка