The most efficient way to reverse a number

后端 未结 10 753

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:22

    If it is 32-bit unsigned integer (987,654,321 being max input) and if you have 4GB free memory(by efficiency, did you mean memory too?),

    result=table[value]; // index 12345 has 54321, index 123 has 321
    

    should be fast enough. Assuming memory is accessed at 100 ns time or 200 cycles and integer is 7 digits on average, other solutions have these:

    • 7 multiplications,
    • 7 adds,
    • 7 modulo,
    • 7 divisions,
    • 7 loop iterations with 7 comparisons

    if these make more than 100 nanoseconds / 200 cycles, then table would be faster. For example, 1 integer division can be as high as 40 cycles, so I guess this can be fast enough. If inputs are repeated, then data will coming from cache will have even less latency.

    But if there are millions of reversing operations in parallel, then computing by CPU is absolutely the better choice (probably 30x-100x speedup using vectorized compute loop + multithreading) than accessing table. It has multiple pipelines per core and multiple cores. You can even choose CUDA/OpenCL with a GPU for extra throughput and this reversing solution from other answers look like perfectly embarrassingly parallelizable since 1 input computes independently of other inputs.

    0 讨论(0)
  • 2021-01-13 05:24
    int ans=0;
    int rev(int n)
    {
      ans=(ans+(n%10))*10; // using recursive function to reverse a number;
      if(n>9) 
        rev(n/10);
    }
    
    int main()
    {
      int m=rev(456123); // m=32
      return 0;
    }
    
    0 讨论(0)
  • 2021-01-13 05:25
    // recursive method to reverse number. lang = java
    static void reverseNumber(int number){
        // number == 0 is the base case
        if(number !=0 ){
            //recursive case
            System.out.print(number %10);
            reverseNumber(number /10);
        }
    }
    
    0 讨论(0)
  • 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 <iostream>
    #include <string>
    #include <algorithm>
    
    
    template <bool B>
    struct SignedNumber
    {
    };
    
    template <>
    struct SignedNumber<true>
    {
        typedef long long type;
    };
    
    template <>
    struct SignedNumber<false>
    {
        typedef unsigned long long type;
    };
    
    template <typename TNumber = int,
              typename TResult = typename SignedNumber<std::is_signed<TNumber>::value>::type,
              typename = typename std::void_t<std::enable_if_t<std::numeric_limits<TNumber>::is_integer>>>
    TResult ReverseNumber(TNumber value)
    {
        bool isSigned = std::is_signed_v<TNumber>;
        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

    0 讨论(0)
提交回复
热议问题