Почему добавление отрицательных целых чисел приводит к положительному целому числу в этой программе C++?

Эта программа в основном проверяет два конца данной последовательности интергеров, добавляет наибольшее из двух к R и изменяет знак конца, который мы не выбрали. Повторяет процесс, пока не останется только один номер (который не добавляется к R). В первой строке входных данных указывается количество промежуточных элементов в последовательности, а в оставшихся - сама последовательность.

Например, если мы введем "5 5 4 3 2 1", мы должны получить "14", потому что только "1" не добавляется к R.

По какой-то причине, когда я ввожу "5 -5 -4 -3 -2 -1", я получаю вывод "10" вместо "-10".

#include <iostream>
using namespace std;

int main(void) {
    int N, *L, R = 0, i = 0, d = 0;
    cin >> N;
    L = new int[N];
    for (; i < N; ++i) cin >> L[i];
    i = 0;
    d = N - 1;
    while (d != i) {
        if (L[i] > L[d]){
            R += L[i];
            L[d] *= -1;
            ++i;
        }
        else {
            R += L[d];
            L[i] *= -1;
            --d;
        }
    }
    cout << R << endl;
    return 0;
}`

1 ответ

Решение

Давайте посмотрим, что происходит во время первых двух итераций. Начнем с:

i = 0
d = 4
L = -5 -4 -3 -2 -1
R = 0

Большой элемент L[d]Итак, мы добавим это, измените знак L[i]и декремент dИтак, теперь мы имеем:

i = 0
d = 3
L = 5 -4 -3 -2 -1
R = -1

Теперь большой элемент L[i]Итак, мы добавим это, измените знак L[d]и приращение i, Итак, теперь мы имеем:

i = 1
d = 3
L = 5 -4 -3 2 -1
R = 4

Как видите, уже после двух итераций результат уже положительный, потому что мы добавили 5 этот раз.

И на всех будущих итерациях мы будем добавлять только числа, которые были сделаны положительными.

Другие вопросы по тегам