Страница 1 из 1

Найти Реднеарифметическое Двух Элементов Равное Х

Добавлено: 21 дек 2012, 15:10
Avicii
Здравствуйте,помогите с программой. Задание: В массиве найти два члена,среднее арифметическое которых ближе всего к Х.
Есть программа,но она ищет только 1 пару таких чисел, а надо все возможные

Код: Выделить всё

#include <iostream>
#include <cmath>
int main()
{
   const unsigned n = 10;
   float X = 5.45;
   int A[n] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
   unsigned first = 0;
   unsigned second = 1;
   float diff = std::abs(((A[first] + A[second]) / 2) - X);
   for (unsigned i = 0; i < n-1; ++i)
   {
      for (unsigned j = i+1; j < n; ++j)
      {
         float calc = std::abs(((A[i] + A[j]) / 2) - X);
         if (calc < diff)
         {
            diff = calc;
            first = i;
            second = j;
         }
      }
   }
   std::cout << "A[" << first << "] = " << A[first] << std::endl;
   std::cout << "A[" << second << "] = " << A[second] << std::endl;
   std::cout << "average = " << ((A[first] + A[second]) / 2) << std::endl;
   return 0;
}

Re: Найти Реднеарифметическое Двух Элементов Равное Х

Добавлено: 28 дек 2012, 10:08
Albor
Чтобы выводило всё, нужно операцию вывода перенести в цикл.

Re: Найти Реднеарифметическое Двух Элементов Равное Х

Добавлено: 06 янв 2013, 18:36
Avicii
Пробовал, в итоге просто пишет один и тот же итог несколько раз.

Re: Найти Реднеарифметическое Двух Элементов Равное Х

Добавлено: 09 янв 2013, 18:34
Albor
Avicii писал(а):Пробовал, в итоге просто пишет один и тот же итог несколько раз.

Код: Выделить всё

if (calc < diff)
         {
            diff = calc;
            first = i;
            second = j;
          // Сюда ставил?
         }

Re: Найти Реднеарифметическое Двух Элементов Равное Х

Добавлено: 24 янв 2013, 01:58
Avicii
Ставил,в итоге :
А[0] = 1
A[2] = 3
average = 2
А[0] = 1
А[4] = 5
average = 3
А[0] = 1
А[6] = 7
average = 4
А[0] = 1
А[8] = 9

Не то что нужно...

Re: Найти Реднеарифметическое Двух Элементов Равное Х

Добавлено: 25 янв 2013, 00:52
Albor
Вывод среднего арифметического

Код: Выделить всё

std::cout << "average = " << (A[first] + A[first]) / 2.0f << std::endl;
а так как у вас, будет отображаться целое. Над алгоритмом тоже нужно поработать - если требуются все пары, тогда наверное нужно хранить где-то промежуточные результаты в виде индексов исходного массива, а для "наиболее близкого" значения нужно 2 переменных, одна из которых будет содержать ближайшее(минимальное) большее, а другая - ближайшее(максимальное) меньшее. Как-то так.

Re: Найти Реднеарифметическое Двух Элементов Равное Х

Добавлено: 28 янв 2013, 17:45
Romeo
Всё верно. По той причине, что определить самое близкое число к указанному можно только проверив все комбинации, следует хранить, скажем, std::vector<std: :p air<int, int>> - вектор пар индексов, среднее арифметическое из которых ближе всего, а так же сама это ближайшее среднее. В цикле проверки пары:

- Если текущее среднее ближе, чем предыдущее найденное ближайшее среднее, то обновляем переменную, хранящую ближайшее среднее новым значением, чистим вектор и заносим найденную пару индексов в него.
- Если текущее среднее такое же, как найденное ранее ближайшее среднее, то просто добавляем пару индексов в вектор.