#cpp
Необходимо два массива объединить в один и оставить в нем только не общие элементы.
Например arr1 {1,2,3,4} + arr2{1,1,5,6}, результат arr3 {3,4,6}.
const int SIZE1 = 8;
const int SIZE2 = 5;
int arr1[SIZE1] = { 0 };
int arr2[SIZE2] = { 0 };
cout << "First array\n";
for (int i = 0; i < SIZE1; i++){
arr1[i] = rand() % 20;
cout << arr1[i] << '\t';
}
cout << "\nSecond array\n";
for (int i = 0; i < SIZE2; i++){
arr2[i] = rand() % 20;
cout << arr2[i] << '\t';
}
cout << endl;
const int SIZE3 = SIZE1 + SIZE2;
int arr3[SIZE3] = { 0 };
cout << "Third array\n";
for (int i = 0; i < SIZE3; i++){
arr3[i] = arr1[i];
if (i >= SIZE1)
arr3[i] = arr2[i-SIZE1];
cout << arr3[i] << '\t';
}
cout << endl;
const int SIZE4 = SIZE3;
int arr4[SIZE4] = { 0 };
int size4 = 0;
for (int i = 0; i < SIZE4; i++){
for (int j = 0; j < SIZE4; j++){
if (arr3[i] == arr3[j]&&i!=j)
break;
else if (arr3[i] != arr3[j]&&j
Ответы
Ответ 1
В C++ весь нужный функционал уже есть, надо только им воспользоваться.
Искомое называется "Симметрическая разность множеств".
#include
#include
#include
#include
#include
using std::set;
using std::vector;
using std::set_symmetric_difference;
using std::ostream_iterator;
using std::cout;
int main()
{
vector first={7,1,1,2,3};
vector second={6,1,2,5,6,7};
const set alpha(begin(first),end(first));
const set beta(begin(second),end(second));
ostream_iterator out(cout,", ");
set_symmetric_difference(begin(alpha),end(alpha),begin(beta),end(beta),out);
return 0;
}
IDEONE
Сперва мы задаем наши массивы first и second.
Затем, конвертируем во множество - std::set
Затем, находим разность и сразу выдаем на терминал;
Послесловие
Я прекрасно понимаю, что это "учебная" задача, нацеленная на изобретение велосипеда,
но. Такая задача к практике не готовит никак. Потому как в реальности, все вакансии
программиста C++ требуют знания STL. А наше дурное образование STL игнорирует.
Ответ 2
Так вот, решение которое я реализовала:
const int SIZE1 = 5;
const int SIZE2 = 7;
int arr1[SIZE1] = { 0 };
int arr2[SIZE2] = { 0 };
for (int i = 0; i < SIZE1; i++)
cout << (arr1[i] = rand() % 10) << "\t";
cout << endl;
for (int i = 0; i < SIZE2; i++)
cout << (arr2[i] = rand() % 10) << "\t";
cout << endl;
const int SIZE3 = SIZE2+SIZE1;
int arr3[SIZE3] = { 0 };
int size3 = 0;
//сравниваем 1 со вторым, разницу записыв в 3
for (int i = 0; i < SIZE1; i++) {
for (int j = 0; j < SIZE2; j++) {
if (arr1[i] == arr2[j])
{
break;
}
else if (arr1[i] != arr2[j]) {
bool exist = false;
for (int k = 0; k < size3; k++) {
if (arr1[i] == arr3[k]) {
exist = true;
break;
}
}
if (exist == false&&j==SIZE2-1) {
arr3[size3] = arr1[i];
size3++;
break;
}
}
}
}
//сравниваем 2 массив с первым, разницу записываем в 3 с места где закончилась запись
сравнения 1 и 2
for (int i = 0; i < SIZE2; i++) {
for (int j = 0; j < SIZE1; j++) {
if (arr2[i] == arr1[j])
{
break;
}
else if (arr2[i] != arr1[j]) {
bool exist = false;
for (int k = 0; k < size3; k++) {
if (arr2[i] == arr3[size3-k]) {
exist = true;
break;
}
}
if (exist == false && j == SIZE1 - 1) {
arr3[size3] = arr2[i];
size3++;
break;
}
}
}
}
cout << "Array 3\n";
for (int i = 0; i < size3; i++) {
cout << arr3[i] << "\t";
}
Всем участника спасибо за помощь!
Ответ 3
Ну, если задание учебное, и вас все равно устраивает эффективность O(n*m), то можно
сделать так - при сравнении сразу добавлять в выходной массив:
bool search(int value, int * begin, int * end)
{
for(;begin != end; ++begin)
if(*begin == value) return true;
return false;
}
int main(int argc, const char * argv[])
{
srand(time(nullptr));
const int SIZE1 = 10;
const int SIZE2 = 5;
int arr1[SIZE1] = { 0 };
int arr2[SIZE2] = { 0 };
int arr [SIZE1+SIZE2] = { 0 };
int size = 0;
for (int i = 0; i < SIZE1; i++)
cout << (arr1[i] = rand() % 15) << "\t";
cout << endl;
for (int i = 0; i < SIZE2; i++)
cout << (arr2[i] = rand() % 15) << "\t";
cout << endl;
for (int i = 0; i < SIZE1; i++)
{
if (search(arr1[i],arr2,arr2+SIZE2)) continue;
arr[size++] = arr1[i];
}
for (int i = 0; i < SIZE2; i++)
{
if (search(arr2[i],arr1,arr1+SIZE1)) continue;
arr[size++] = arr2[i];
}
for (int i = 0; i < size; i++)
cout << arr[i] << "\t";
cout << endl;
}
Правда, так мы не убираем дубли в одном массиве (но если они допустимы во входном,
почему их не должно быть в выходном?) - но это просто, надо только добавить в циклы
search еще и по выходному массиву.
Комментариев нет:
Отправить комментарий