Професионална програма
Loading...
+ Нов въпрос
RaUndreundre avatar RaUndreundre 52 Точки

Проблем с overflow при INFINITY

Здравейте, задача от C++ фундаментъл курса.
Task 5 – Min and Max
Write a program that reads an integer number N, then a line of N integers, and prints the minimum and maximum of those integers

https://judge.softuni.bg/Contests/Compete/Index/2939#4
Ясно е че задачката си има няколко лесни решения. Реших обаче да "резна' малко едно от тези решения.
 

#include <iostream>
#include <cstdint>

int main() {
    int num;
    int min = INT32_MAX, max = INT32_MIN;
    std::cin >> num;
    for (int i = 0; i < num; i++) {
        int currNumber = 0;
        std::cin >> currNumber;
        if (currNumber < min) {
            min = currNumber;
        } else if (currNumber > max) {
            max = currNumber;
        }
    }
    std::cout << min << " " << max << std::endl;
    return 0;
}

И при някои определени комбинации от вход, получавам overflow, например:
 

Вход:
2
5 -1

Изход:
-1 -2147483648

И това е така, независимо дали ще ползвам INFINITY, INT_MAX, INT32_MAX.
Разбира се, с един if(i == 0){ ...  - вътре във loop-a тоя проблем се отстранява, но пък се обезсмисля, че по-горе се дава стойност безкрайност.
Въпроса ми е: Има ли вариант при който "безопасно" да се ползва INFINITY или  INT_MAX или INT32_MAX или друго подобно, и да няма изненади като overflow?

1
C++ Programming
MartinBG avatar MartinBG 3909 Точки
Best Answer

Проблемът не е в използването на INT_MAX или INT32_MAX, а в алгоритъма, който ще работи само при стойности, подадени в конкретна последователност (например -1 5, но не и 5 -1).

Лесно може да видите проблема, ако дебъгнете програмата.

Програмата ще изведе грешен резултат и при вход:

1
-1

=> -1 -2147483648

Втората стойност (max) не се променя, защото програмта приключва след едно число.

В горния пример отговорът трябва да е:

-1 -1

Това се оправя, ако двете проверки се правят независимо една от друга:

    if (currNumber < min) {
      min = currNumber;
    }
    if (currNumber > max) {
      max = currNumber;
    }

Инайте предвид, че и така програмата ще изведе грешен резултат при 0 въведени числа от конзолата :)

2
27/03/2021 15:29:38
RaUndreundre avatar RaUndreundre 52 Точки

:-) да, тоя else ми счупи главата - много тъпа грешка....

1