Алгоритм, который может суммировать 4 цифры в парах так, чтобы их разность сумм была как можно ближе - PullRequest
4 голосов
/ 22 сентября 2019

У меня есть домашнее задание на C++, которое требует от меня ввода 4 натуральных чисел и их сопряжения так, чтобы разница между их суммами была как можно меньше.

Пример:

I have entered 4 numbers: 4; 3; 2; 1;
The smallest between the numbers would be 0 --> 4 + 1 and 3 + 2

Я написал некоторый код, используя операторы if, но для проверки каждой комбинации требуется много кода, поэтому мне было интересно, есть ли более короткий способ выполнить эту задачу

#include <iostream>
using namespace std;

int main()
{
    int a, b, c, d;
    int x, y, z;

    cout << "Insert 1st number" << endl;
    cin >> a;
    cout << "Insert 2nd number" << endl;
    cin >> b;
    cout << "Insert 3rd number" << endl;
    cin >> c;
    cout << "Insert 4th number" << endl;
    cin >> d;

    if ((a > b) && (b > c) && (c > d))
    {
        x = a + d;
        y = b + c;
        z = x - y;

        cout << "The smallest differnce is: " << z << endl;
        cout << endl;
    }
    else if ((a > b) && (b > c) && (c < d))
    {
        x = a + c;
        y = b + d;
        z = x - y;
        cout << "The smallest differnce is: " << z << endl;
        cout << endl;
    }
    else if ((a > b) && (b < c) && (c > d))
    {
        x = a + b;
        y = d + c;
        z = x - y;
        cout << "The smallest differnce is: " << z << endl;
        cout << endl;
    }
}

Ответы [ 2 ]

3 голосов
/ 22 сентября 2019

Если это только 4 натуральные числа, выполните следующие действия.

  • Прежде всего, создайте обычный массив (т. Е. int[4] или) и std::array<int, 4> и получите ввод пользователя
  • Сортировать массив по возрастанию (или по убыванию).
  • Разница между (1 st + 4 th ) элементами и (2 th + 3 th ) элементов дает результат.

Вот пример кода

#include <iostream>
#include <array>     // std::array
#include <algorithm> // std::sort

int main()
{
    std::array<int, 4> arr;
    for (int& element : arr) std::cin >> element;
    std::sort(arr.begin(), arr.end());
    int result = (arr[0] + arr[3]) - (arr[1] + arr[2]);
    std::cout << "The smallest difference is: " << result << "\n";
}

( Смотреть онлайн )

1 голос
/ 23 сентября 2019

Чтобы доказать отсортированную версию |(a + d) - (b + c)|, где a ≤ b ≤ c ≤ d, всегда работает: (1) четко c и d никогда не сочетаются, так как это максимизирует сумму одной стороны и минимизирует другую, что приводит кнаибольшая возможная разница.Теперь, когда мы знаем, что c с одной стороны, а d с другой, мы явно хотим добавить к большей стороне (ту же или) меньшую, чем добавим к меньшей стороне.

...