Реверсирование целого числа в С++

Есть ли лучший способ обратить целое число, чем этот?

    int reverse(int x) {
        int out=0;
        while(x)
        {
            if(out > INT_MAX/10 || out < INT_MIN/10){return 0;}
            else{
                out = out*10 + x%10;
                x /= 10;
            }
        }
        return out;
    }

person Ghiri Hari    schedule 06.01.2021    source источник
comment
Обратите внимание, что C и C++ — это разные языки. Не отмечайте оба, так как лучшее решение может быть разным для двух.   -  person kaylum    schedule 06.01.2021
comment
Определить обратное целое число. Обратное строковое представление целого числа? Потому что у чисел нет очевидной обратной функции. Честно говоря, я бы, вероятно, преобразовал его в строку, перевернул ее, а затем преобразовал обратно в int, если вам действительно не нужна производительность.   -  person Gabe Sechan    schedule 06.01.2021
comment
То, как вы проверяете переполнение out, неверно.   -  person Evg    schedule 06.01.2021


Ответы (2)


Есть ли лучший способ инвертировать целое число, чем этот?

Ну, в программировании что-то вроде лучший способ не имеет четкого определения. Другими словами, это может означать несколько вещей. Это может быть лучшая производительность, лучшее использование памяти и т.д.

Однако самое главное, что код не содержит ошибок.

Ваш код не свободен от ошибок во всех случаях.

Рассмотрим малоизвестную систему, где INT_MAX равно 41, а затем вызовем вашу функцию со значением 34.

Это не удастся.

Проблема в том, что ваша проверка переполнения игнорирует часть x%10, которая добавляется после умножения на 10. Другими словами, INT_MAX может иметь значение, при котором out*10 не будет переполняться, но как только вы добавите x%10, оно переполнится. .

person 4386427    schedule 06.01.2021
comment
Это также не удастся с отрицательным числом. - person Gabe Sechan; 06.01.2021

Да, в случае C++ есть очень простой способ.

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>

int Reverse(int x)
{
    // Read number to a string stream
    std::stringstream ss;
    ss << x;

    // Take the string in stringstream
    std::string s = ss.str();
    std::reverse(s.begin(), s.end());
    ss.str(s);

    // Take the number from reversed string.
    int ret;
    if (!(ss >> ret)) ret = 0;

    return ret;
}

int main()
{
    std::cout << Reverse(1234); // Or any number for test.
    return 0;
}

Это лучше с точки зрения простоты и понятности кода. С точки зрения производительности, я думаю, ваша первоначальная реализация могла бы быть лучше.

person Ashutosh Raghuwanshi    schedule 06.01.2021
comment
Вместо того, чтобы просто писать код, объясните, что происходит в коде. - person Geno C; 06.01.2021
comment
Вам нужно добавить специальную обработку для отрицательных входных значений. Текущий код не работает. Кстати: #include <algorithm> - person 4386427; 06.01.2021
comment
@ 4386427 Это работало без включения «алгоритма» на моем VS 2019, поэтому я его пропустил. Спасибо за напоминание. Также добавлена ​​проверка переполнения. - person Ashutosh Raghuwanshi; 06.01.2021
comment
Почему бы не просто if (!(ss >> ret)) ret = 0;? - person Evg; 06.01.2021
comment
@Evg Спасибо за дальнейшее упрощение. - person Ashutosh Raghuwanshi; 06.01.2021