@dangor266

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

Надо переделать функцию passForCommonElements(), чтобы она находила и выводила по одному разу общие элементы трех массивов.
#include<iostream>

using namespace std;

template < typename T>
void passForCommonElements(T array1[], T array2[], T array3[], int size1, int size2, int size3) //поиск и вывод общих элементов массивы 
{
	T* arrayCommonElements = new T[size1]();

	int g = 0;
	int i = 0;
	int j = 0;
	int k = 0;
	int p = 0;

	while (g)
	while (g < size1)
	{

		while (i < size1)
		{
			j = 0;
			while (j < size2)
			{
				if (array1[i] == array2[j])
				{
					k = 0;
					while (k < size3)
					{
						if (array1[i] == array3[k])
						{
							p = 0;
							while (p < size1)
							{
								if (array1[i] != arrayCommonElements[p])
								{
									arrayCommonElements[g] = array1[i];
								}
								p++;
							}
						}
						k++;
					}
				}
				j++;
			}
			i++;
		}
		
	}
	
	int h = 0;
	cout << "Общие элементы трех массивов: ";
	while (h < size1)
	{
		cout << array1[h] << " ";
		h++;
	}
	cout << endl;
	

	
	delete[] arrayCommonElements;
}

template < typename T1>
void outputElements(T1 array1[], T1 array2[], T1 array3[], int size1, int size2, int size3) //поиск и вывод общих элементов массивы 
{
	int i = 0;
	cout << "Элементы первого массива: ";
	while (i < size1)
	{
		cout << array1[i] << " ";
		i++;
	}
	cout << endl;

	i = 0;
	cout << "Элементы второго массива: ";
	while (i < size2)
	{
		cout << array2[i] << " ";
		i++;
	}
	cout << endl;

	i = 0;
	cout << "Элементы третьего массива: ";
	while (i < size3)
	{
		cout << array3[i] << " ";
		i++;
	}
	cout << endl;
}

void inputElementsFloat(float* array1, float* array2, float* array3, int size1, int size2, int size3)
{
	int i = 0;
	while (i < size1)
	{
		cout << "Введите значение элемента первого массива под индексом " << i << ": " << endl;
		cin >> array1[i];
		i++;
	}
	cout << endl;

	i = 0;
	while (i < size2)
	{
		cout << "Введите значение элемента второго массива под индексом " << i << ": " << endl;
		cin >> array2[i];
		i++;
	}
	cout << endl;

	i = 0;
	while (i < size3)
	{
		cout << "Введите значение элемента третьего массива под индексом " << i << ": " << endl;
		cin >> array3[i];
		i++;
	}
	cout << endl;
}

void inputElementsInt(int* array1, int* array2, int* array3, int size1, int size2, int size3)
{
	int i = 0;
	while (i < size1)
	{
		cout << "Введите значение элемента первого массива под индексом " << i << ": " << endl;
		cin >> array1[i];
		i++;
	}
	cout << endl;

	i = 0;
	while (i < size2)
	{
		cout << "Введите значение элемента второго массива под индексом " << i << ": " << endl;
		cin >> array2[i];
		i++;
	}
	cout << endl;

	i = 0;
	while (i < size3)
	{
		cout << "Введите значение элемента третьего массива под индексом " << i << ": " << endl;
		cin >> array3[i];
		i++;
	}
	cout << endl;
}


int main()
{
	setlocale(LC_ALL, "ru");

	int k, m, n;
	int arrayType;

	cout << "Введите размер первого массива:" << endl;
	cin >> k;
	cout << endl << "Введите размер второго массива:" << endl;
	cin >> m;
	cout << endl << "Введите размер третьего массива:" << endl;
	cin >> n;

	cout << endl << "Введите значение типа массива:" << endl;
	cout << endl << "0 - float";
	cout << endl << "1 - int" << endl << endl;
	cin >> arrayType;
	if (arrayType)
	{
		
		int* array1 = new int[k];
		int* array2 = new int[m];
		int* array3 = new int[n];


		inputElementsInt(array1, array2, array3, k, m, n);
		
		outputElements(array1, array2, array3, k, m, n);

		passForCommonElements(array1, array2, array3, k, m, n);

		delete[] array1;
		delete[] array2;
		delete[] array3;
	}
	else
	{
		
		float* array1 = new float[k];
		float* array2 = new float[m];
		float* array3 = new float[n];

		inputElementsFloat(array1, array2, array3, k, m, n);

		outputElements(array1, array2, array3, k, m, n);

		passForCommonElements(array1, array2, array3, k, m, n);

		delete[] array1;
		delete[] array2;
		delete[] array3;
	}

	
	
	return 0;
}


61e7ddfd95c45610924035.png
  • Вопрос задан
  • 322 просмотра
Решения вопроса 2
@WAR_VIK
Вот код покороче:
#include <iostream>

template <typename T>
void commonElem(T a[], T a2[], T a3[], int len, int len2, int len3) {
  std::cout<<"Common elements arrays is: ";
  for(int i{0}; i < len; ++i) {
    bool f2{false}, f3{false};
    for(int j{0}; j < len2; ++j) if(a[i] == a2[j]) f2 = true;
    for(int k{0}; k < len3; ++k) if(a[i] == a3[k]) f3 = true;
    if(f2 && f3) std::cout << a[i] << ' ';
  }
}

int main() {
int arr[]{23,12,54,2,7}, arr2[]{2,23,1,65}, arr3[]{43,2,76,4,23,8,96};
int l = std::size(arr), l2 = std::size(arr2), l3 = std::size(arr3);
commonElem(arr, arr2, arr3, l, l2, l3);
return 0;
}
Ответ написан
Комментировать
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Какой ужасный алгоритм! Лучше запихнуть первые два массива в hash-set (std::unordered_set). А потом при проходе по третьему массиву просто проверить, что этот элемент есть в первых двух set-ах.

Если элементы могут повторятся, но выводить надо только один раз, то заведите еще один unordered_set, куда добавляйте элементы, которые вы добавили в ответ. Естественно, перед добавлением элемента в ответ, проверьте, а не содержится ли он уже в этом set-е.

И код получится раз в 10 меньше и работать будет на пару порядков быстрее.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
Второй вопрос ТС за день, и второй раз достаточно внимательно прочитать собственный код, чтобы найти ошибку.
Предлагаю просто игнорировать этого лентяя, джентльмены.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы