Как собрать в третий массив различные элементы из двух массивов?
Даны два массива: А[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 шт):
Прошу Вас обратить внимание на то, что фрагмент кода
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;
}