Найти пару чисел разных знаков в массиве
Задание: Определить количество пар двух одинаковых чисел разных знаков в массиве. Также была идея что один цикл идет с начала, второй с конца, и ищет пары, но так из за размера массива и количества чисел меньше или больше ноля, такие пары могут и не встретиться. Нужна помощь как это решить.
Пример: имеется упорядоченный массив {-10, -10, -1, 0, 1, 1, 1, 2, 2, 10 }, то результатом должно быть число 5 (количество пар). Все пары: (-10, 10); (-10, 10); (-1, 1); (-1, 1); (-1, 1).
code:
#include <iostream>
#include <ctime>
using namespace std;
int main() {
srand((unsigned int)time(NULL));
int N;
cout << "Enter array size: ";
cin >> N;
int *arr = new int[N];
for (int i = 0; i < N; i++)
arr[i] = (rand() % 20) - 10; // nums in range from -10 to 10
int num_of_pairs = 0; // var for calculating number of pairs
// solution here
delete[] arr;
return 0;
}
Ответы (3 шт):
Ответ:
void positive_negative_pairs(int *arr, int N) {
int *arr_copy = array_copying(arr, N);
int PosNegPairs = 0;
for( int i = 0; i < N; i++){
for(int j = i + 1; j < N; j++){
if( -arr_copy[i] == arr_copy[j] || arr_copy[i] == -arr_copy[j] )
PosNegPairs++;
}
}
cout << "Number of positive-negative pairs: " << PosNegPairs << endl;
delete[] arr_copy;
}
Старый вариант. Если массив { -1, -1, -1, 1, 1 }, то результатом программы будет 2.
Перед этим необходимо отсортировать массив и подключить математическую библиотеку. Вроде работает, пытался избежать большой вычислительной сложности, действуя по принципу сужения (Похоже на очень стремный велосипед=))
int lastIndex = sizeArr;
for (int i = 0; i < sizeArr && arr[i] < 0; ++i)
{
int current = abs(arr[i]);
for (int j = lastIndex - 1; j >= 0 && arr[j] > 0; --j)
if (arr[j] == current)
{
pairs++;
lastIndex = j;
break;
}
}
UPD (Новый вариант):
Программа переделана под корректные условия. Если массив { -1, -1, -1, 1, 1 }, то результатом программы будет 6 (Массив по прежнему необходимо отсортировать + подключить математическую библиотеку).
for (int i = 0; i < sizeArr && arr[i] < 0; ++i)
{
int current = abs(arr[i]);
for (int j = sizeArr - 1; arr[j] > 0 && current <= arr[j]; --j)
if (current == arr[j]) pairs++;
}
Просто и без сортировки:
const size_t size = std::size(arr);
int k = 0;
for (int i = 0; i < size; ++i)
for (size_t j = i + 1; j < size; ++j)
if (-arr[i] == arr[j] )
++k;
cout << k;
Например в массиве { -2, 45, 34, 2, -2, 2, -2, 6, -34, 34, -6 } есть 9 таких пар