Reverse digits of an integer with overflow handled

07 Jun, 2022
Write a program to reverse an integer assuming that the input is a 32-bit integer. If the reversed integer overflows, print -1 as the output. Let us see a simple approach to reverse digits of an integer.  
C++
C
Java
Python3
C#
PHP
Javascript
// A simple C program to reverse digits of// an integer.#include <bits/stdc++.h>using namespace std; int reversDigits(int num){    int rev_num = 0;    while (num > 0) {        rev_num = rev_num * 10 + num % 10;        num = num / 10;    }    return rev_num;} /* Driver program to test reversDigits */int main(){    int num = 5896;    cout << "Reverse of no. is " << reversDigits(num);    return 0;} // This code is contributed by Sania Kumari Gupta (kriSania804)
// A simple C program to reverse digits of// an integer.#include <stdio.h> int reversDigits(int num){    int rev_num = 0;    while (num > 0) {        rev_num = rev_num * 10 + num % 10;        num = num / 10;    }    return rev_num;} /* Driver program to test reversDigits */int main(){    int num = 5896;    printf("Reverse of no. is %d", reversDigits(num));    return 0;} // This code is contributed by Sania Kumari Gupta (kriSania804)
// Java program to reverse a number class GFG{    /* Iterative function to reverse    digits of num*/    static int reversDigits(int num)    {        int rev_num = 0;        while(num > 0)        {            rev_num = rev_num * 10 + num % 10;            num = num / 10;        }        return rev_num;    }         // Driver code    public static void main (String[] args)    {        int num = 4562;        System.out.println("Reverse of no. is "                           + reversDigits(num));    }} // This code is contributed by Anant Agarwal.
# Python program to reverse a number n = 4562;rev = 0 while(n > 0):    a = n % 10    rev = rev * 10 + a    n = n // 10     print(rev) # This code is contributed by Shariq Raza
// C# program to reverse a numberusing System; class GFG{    // Iterative function to    // reverse digits of num    static int reversDigits(int num)    {        int rev_num = 0;        while(num > 0)        {            rev_num = rev_num * 10 + num % 10;            num = num / 10;        }        return rev_num;    }         // Driver code    public static void Main()    {        int num = 4562;        Console.Write("Reverse of no. is "                        + reversDigits(num));    }} // This code is contributed by Sam007
<?php// Iterative function to// reverse digits of numfunction reversDigits($num){    $rev_num = 0;    while($num > 1)    {        $rev_num = $rev_num * 10 +                        $num % 10;        $num = (int)$num / 10;    }    return $rev_num;} // Driver Code$num = 4562;echo "Reverse of no. is ",       reversDigits($num); // This code is contributed by aj_36?>
<script> // A simple Javascript program to reverse digits of// an integer. function reversDigits(num){    let rev_num = 0;    while (num > 0)    {        rev_num = rev_num*10 + num%10;        num = Math.floor(num/10);    }    return rev_num;} /* Driver program to test reversDigits */      let num = 5896;    document.write("Reverse of no. is "+ reversDigits(num));     // This code is contributed by Mayank Tyagi </script>
Reverse of no. is 6985
Time Complexity: O(log(num))
Auxiliary Space: O(1)
However, if the number is large such that the reverse overflows, the output is some garbage value. If we run the code above with input as any large number say 1000000045, then the output is some garbage value like 1105032705 or any other garbage value. See this for the output.How to handle overflow? The idea is to store previous value of the sum can be stored in a variable which can be checked every time to see if the reverse overflowed or not.Below is the implementation to deal with such a situation. 
C++
C
Java
Python3
C#
Javascript
// C++ program to reverse digits// of a number#include <bits/stdc++.h> using namespace std; /* Iterative function to reversedigits of num*/int reversDigits(int num){    // Handling negative numbers    bool negativeFlag = false;    if (num < 0)    {        negativeFlag = true;        num = -num ;    }     int prev_rev_num = 0, rev_num = 0;    while (num != 0)    {        int curr_digit = num % 10;         rev_num = (rev_num * 10) + curr_digit;         // checking if the reverse overflowed or not.        // The values of (rev_num - curr_digit)/10 and        // prev_rev_num must be same if there was no        // problem.        if ((rev_num - curr_digit) /               10 != prev_rev_num)        {            cout << "WARNING OVERFLOWED!!!"                 << endl;            return 0;        }         prev_rev_num = rev_num;        num = num / 10;    }     return (negativeFlag == true) ?                         -rev_num : rev_num;} // Driver Codeint main(){    int num = 12345;    cout << "Reverse of no. is "         << reversDigits(num) << endl;     num = 1000000045;    cout << "Reverse of no. is "         << reversDigits(num) << endl;     return 0;} // This code is contributed// by Akanksha Rai(Abby_akku)
// C program to reverse digits of a number#include <stdio.h> /* Iterative function to reverse digits of num*/int reversDigits(int num){    // Handling negative numbers    bool negativeFlag = false;    if (num < 0)    {        negativeFlag = true;        num = -num ;    }     int prev_rev_num = 0, rev_num = 0;    while (num != 0)    {        int curr_digit = num%10;         rev_num = (rev_num*10) + curr_digit;         // checking if the reverse overflowed or not.        // The values of (rev_num - curr_digit)/10 and        // prev_rev_num must be same if there was no        // problem.        if ((rev_num - curr_digit)/10 != prev_rev_num)        {            printf("WARNING OVERFLOWED!!!\n");            return 0;        }         prev_rev_num = rev_num;        num = num/10;    }     return (negativeFlag == true)? -rev_num : rev_num;} /* Driver program to test reverse Digits */int main(){    int num = 12345;    printf("Reverse of no. is %d\n", reversDigits(num));     num = 1000000045;    printf("Reverse of no. is %d\n", reversDigits(num));     return 0;}
// Java program to reverse digits of a number class ReverseDigits{    /* Iterative function to reverse digits of num*/    static int reversDigits(int num)    {        // Handling negative numbers        boolean negativeFlag = false;        if (num < 0)        {            negativeFlag = true;            num = -num ;        }              int prev_rev_num = 0, rev_num = 0;        while (num != 0)        {            int curr_digit = num%10;                  rev_num = (rev_num*10) + curr_digit;                  // checking if the reverse overflowed or not.            // The values of (rev_num - curr_digit)/10 and            // prev_rev_num must be same if there was no            // problem.            if ((rev_num - curr_digit)/10 != prev_rev_num)            {                System.out.println("WARNING OVERFLOWED!!!");                return 0;            }                  prev_rev_num = rev_num;            num = num/10;        }              return (negativeFlag == true)? -rev_num : rev_num;    }         public static void main (String[] args)    {        int num = 12345;        System.out.println("Reverse of no. is " + reversDigits(num));              num = 1000000045;        System.out.println("Reverse of no. is " + reversDigits(num));    }}
# Python program to reverse digits# of a number """ Iterative function to reversedigits of num"""def reversDigits(num):     # Handling negative numbers    negativeFlag = False    if (num < 0):             negativeFlag = True        num = -num          prev_rev_num = 0    rev_num = 0    while (num != 0):             curr_digit = num % 10         rev_num = (rev_num * 10) + curr_digit         # checking if the reverse overflowed or not.        # The values of (rev_num - curr_digit)/10 and        # prev_rev_num must be same if there was no        # problem.        if (rev_num >= 2147483647 or            rev_num <= -2147483648):            rev_num = 0        if ((rev_num - curr_digit) // 10 != prev_rev_num):                     print("WARNING OVERFLOWED!!!")            return 0                  prev_rev_num = rev_num        num = num //10          return -rev_num if (negativeFlag == True) else rev_num    # Driver codeif __name__ =="__main__":    num = 12345    print("Reverse of no. is ",reversDigits(num))     num = 1000000045    print("Reverse of no. is ",reversDigits(num))              # This code is contributed# Shubham Singh(SHUBHAMSINGH10)
// C# program to reverse digits// of a numberusing System; class GFG{ /* Iterative function to reverse   digits of num*/static int reversDigits(int num){    // Handling negative numbers    bool negativeFlag = false;    if (num < 0)    {        negativeFlag = true;        num = -num ;    }     int prev_rev_num = 0, rev_num = 0;    while (num != 0)    {        int curr_digit = num % 10;         rev_num = (rev_num * 10) +                   curr_digit;         // checking if the reverse overflowed        // or not. The values of (rev_num -        // curr_digit)/10 and prev_rev_num must        // be same if there was no problem.        if ((rev_num - curr_digit) / 10 != prev_rev_num)        {            Console.WriteLine("WARNING OVERFLOWED!!!");            return 0;        }         prev_rev_num = rev_num;        num = num / 10;    }     return (negativeFlag == true) ?                         -rev_num : rev_num;} // Driver Codestatic public void Main (){    int num = 12345;    Console.WriteLine("Reverse of no. is " +                         reversDigits(num));     num = 1000000045;    Console.WriteLine("Reverse of no. is " +                         reversDigits(num));}} // This code is contributed by ajit
<script>// JavaScript program to reverse digits// of a number /* Iterative function to reversedigits of num*/function reversDigits(num){    // Handling negative numbers    let negativeFlag = false;    if (num < 0)    {        negativeFlag = true;        num = -num ;    }     let prev_rev_num = 0, rev_num = 0;    while (num != 0)    {        let curr_digit = num % 10;         rev_num = (rev_num * 10) + curr_digit;         // checking if the reverse overflowed or not.        // The values of (rev_num - curr_digit)/10 and        // prev_rev_num must be same if there was no        // problem.        if (rev_num >= 2147483647 ||            rev_num <= -2147483648)            rev_num = 0;        if (Math.floor((rev_num - curr_digit) / 10) != prev_rev_num)        {            document.write("WARNING OVERFLOWED!!!"                + "<br>");            return 0;        }         prev_rev_num = rev_num;        num = Math.floor(num / 10);    }     return (negativeFlag == true) ?                        -rev_num : rev_num;} // Driver Code    let num = 12345;    document.write("Reverse of no. is "        + reversDigits(num) + "<br>");     num = 1000000045;    document.write("Reverse of no. is "        + reversDigits(num) + "<br>");     // This code is contributed by Surbhi Tyagi.</script>
Reverse of no. is 54321
WARNING OVERFLOWED!!!
Reverse of no. is 0
Time Complexity: O(log(num))
Auxiliary Space: O(1)
Efficient Approach :
The above approach won’t work if we are given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [-231, 231 – 1], then return 0.
So we cannot multiply the number*10 and then check if the number overflows or not.
We must check the overflow condition before multiply by 10 by using the following logic :
You are checking the boundary case before you do the operation. (reversed >INT_MAX ) wouldn’t work 
because reversed will overflow and become negative if it goes past MAX_VALUE. 
Dividing MAX_VALUE by 10 lets you check the condition without overflowing
INT_MAX is equal 2147483647. INT_MIN is equal  -2147483648. 
Last digits are 7 and 8. This is the reason why we also  check  rem > 7 and rem < -8 conditions
C++
Java
Python3
Javascript
// C++ program to reverse digits// of a number#include <bits/stdc++.h> using namespace std;int reversDigits(int num) {         int rev = 0  ;         while(num != 0){                int rem = num % 10 ;        num /= 10 ;                 if(rev > INT_MAX/10 || rev == INT_MAX/10 && rem > 7){            return 0 ;        }                 if(rev < INT_MIN/10 || rev == INT_MIN/10 && rem < -8){            return 0 ;        }                 rev = rev*10 + rem ;    }         return rev ;     } // Driver Codeint main(){    int num = 12345;    cout << "Reverse of no. is "         << reversDigits(num) << endl;     num = 1000000045;    cout << "Reverse of no. is "         << reversDigits(num) << endl;     return 0;}
// Java program to reverse digits// of a numberpublic class GFG{   static int reversDigits(int num)  {    int rev = 0  ;     while(num != 0){             int rem = num % 10 ;      num /= 10 ;       if(rev > Integer.MAX_VALUE/10 || rev == Integer.MAX_VALUE/10 && rem > 7){        return 0 ;      }       if(rev < Integer.MIN_VALUE/10 || rev == Integer.MIN_VALUE/10 && rem < -8){        return 0 ;      }       rev = rev*10 + rem ;    }     return rev ;  }   // Driver code  public static void main (String[] args)  {    int num = 12345;    System.out.println("Reverse of no. is " + reversDigits(num) );     num = 1000000045;    System.out.println("Reverse of no. is " + reversDigits(num) );  }} // This code is contributed by jana_sayantan.
# Python program for the above approachINT_MAX = 2147483647INT_MIN = -2147483648 def reversDigits(num):         rev = 0         while(num > 0):           rem = num % 10        num = (num//10)                 if(rev > INT_MAX/10 or rev == INT_MAX/10 and rem > 7):            return 0                 if(rev < INT_MIN/10 or rev == INT_MIN/10 and rem < -8):            return 0                 rev = rev*10 + rem         return rev # Driver Codenum = 12345print(f"Reverse of no. is {reversDigits(num)}") num = 1000000045print(f"Reverse of no. is {reversDigits(num)}") # This code is contributed by shinjanpatra
<script> // JavaScript program to reverse digits// of a number const INT_MAX = 2147483647;const INT_MIN = -2147483648; function reversDigits(num) {         let rev = 0;         while(num > 0){                let rem = num % 10 ;        num = Math.floor(num/10) ;                 if(rev > INT_MAX/10 || rev == INT_MAX/10 && rem > 7){            return 0 ;        }                 if(rev < INT_MIN/10 || rev == INT_MIN/10 && rem < -8){            return 0 ;        }                 rev = rev*10 + rem ;     }         return rev ;     } // Driver Code let num = 12345;document.write(`Reverse of no. is ${reversDigits(num)}`,"</br>"); num = 1000000045;document.write(`Reverse of no. is ${reversDigits(num)}`,"</br>"); // This code is contributed by shinjanpatra </script>
Reverse of no. is 54321
Reverse of no. is 0
Time Complexity: O(log(num))
Auxiliary Space: O(1)
This article is contributed by MAZHAR IMAM KHAN. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
jit_t
Akanksha_Rai
SHUBHAMSINGH10
mayanktyagi1709
surbhityagi15
prasanna1995
amartyaghoshgfg
shinjanpatra
prophet1999
jana_sayantan
krisania804
number-digits
Mathematical
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Merge two sorted arrays
Operators in C / C++
Sieve of Eratosthenes
Prime Numbers
Program to find GCD or HCF of two numbers
Minimum number of jumps to reach end
Find minimum number of coins that make a given value
The Knight's tour problem | Backtracking-1
Algorithm to solve Rubik's Cube
Program for Decimal to Binary Conversion