The most efficient way to reverse a number

后端 未结 10 817

I am looking for an efficient algorithm to reverse a number, e.g.

Input: 3456789

Output: 9876543

In C++ there are p

10条回答
  •  时光取名叫无心
    2021-01-13 05:28

    This solution is not as efficient but it does solve the problem and can be useful. It returns long long for any signed integer(int, long, long long, etc) and unsigned long long for any unsigned integer (unsigned int, unsigned long, unsigned long long, etc).

    The char type depends of compiler implementation can be signed or unsigned.

    #include 
    #include 
    #include 
    
    
    template 
    struct SignedNumber
    {
    };
    
    template <>
    struct SignedNumber
    {
        typedef long long type;
    };
    
    template <>
    struct SignedNumber
    {
        typedef unsigned long long type;
    };
    
    template ::value>::type,
              typename = typename std::void_t::is_integer>>>
    TResult ReverseNumber(TNumber value)
    {
        bool isSigned = std::is_signed_v;
        int sign = 1;
        if (value < 0)
        {
            value *= -1;
            sign = -1;
        }
        std::string str = std::to_string(value);
        std::reverse(str.begin(), str.end());
        return isSigned ? std::stoll(str) * sign : std::stoull(str) * sign;
    }
    
    int main()
    {
        std::cout << ReverseNumber(true) << std::endl; //bool -> unsigned long long
        std::cout << ReverseNumber(false) << std::endl; //bool -> unsigned long long
        std::cout << ReverseNumber('@') << std::endl; //char -> long long or unsigned long long 
        std::cout << ReverseNumber(46) << std::endl; //int -> long long
        std::cout << ReverseNumber(-46) << std::endl; //int -> long long
        std::cout << ReverseNumber(46U) << std::endl; //unsigned int -> unsigned long long
        std::cout << ReverseNumber(46L) << std::endl; //long -> long long
        std::cout << ReverseNumber(-46LL) << std::endl; //long long -> long long
        std::cout << ReverseNumber(46UL) << std::endl; //unsigned long -> unsigned long long
        std::cout << ReverseNumber(4600ULL) << std::endl; //unsigned long long -> unsigned long long
    }
    

    Output

    1
    0
    64
    64
    -64
    64
    64
    -64
    64
    64
    

    Test this code
    https://repl.it/@JomaCorpFX/IntegerToStr#main.cpp

提交回复
热议问题