C program to reverse digits of an integer with overflow handled

In this blog post, we learn how to write a C program to reverse digits of an integer with overflow handled? Write C program to reverse digits of an integer with overflow handled. How to find reverse of a number with overflow handled in C programming. Write a program to reverse an integer assuming that the input is a 32-bit integer. Let’s see an example,

Input : num = 12345
Output : 54321

Input : num = 1000000045
Output : WARNING OVERFLOWED!!!

 

First, let see a simple C program to reverse the digits of an integer.

#include <stdio.h>

//Recursive function to
//reverse digits of number
int reversDigits(int num)
{
    static int rev_num = 0;
    static int base_pos = 1;
    if(num > 0)
    {
        reversDigits(num/10);
        rev_num += (num%10)*base_pos;
        base_pos *= 10;
    }
    return rev_num;
}


int main()
{
    int number, reversed = 0;

    //Input a number from user
    printf("Enter any number = ");
    scanf("%d", &number);

    reversed = reversDigits(number);

    printf("Reverse of no. is %d", reversed);

    return 0;
}

Output:

Enter any number = 12345
Reverse of no. is 54321

Enter any number = 1000000045
Reverse of no. is 1105032705

 

However, if the number is large such that the reverse overflows, the output is some garbage value. If we run the above code with input as any large number say 1000000045, then the output is some garbage value like 1105032705 or any other garbage value.

 

How to handle overflow?

The idea is to store the previous value of the sum that can be stored in a variable that can be checked every time to see if the reverse overflowed or not.

Note: Assuming input is a 32-bit integer.

 

int reversDigits(int num)
{
    int tmp = 0;

    //If num is negative, then convert it to positive
    tmp = (num < 0)? (-1 * num): num;

    int prev_rev_num = 0, rev_num = 0;
    while (tmp != 0)
    {
        int last_digit = tmp%10;

        prev_rev_num = (rev_num*10) + last_digit;

        // checking if the reverse overflowed or not.
        // The values of (rev_num - last_digit)/10 and
        // prev_rev_num must be same if there was no
        // problem.
        if ((prev_rev_num - last_digit)/10 != rev_num)
        {
            printf("WARNING OVERFLOWED!!!\n");
            return 0;
        }
        else
        {
            rev_num = prev_rev_num;
        }

        tmp = tmp/10;
    }

    return (num < 0)? -rev_num : rev_num;
}

int main()
{
    int number, reversed = 0;

    //Input a number from user
    printf("Enter any number = ");
    scanf("%d", &number);

    //Reverse the number
    reversed = reversDigits(number);
    if(reversed != 0)
    {
        printf("Reverse of no. is %d", reversed);
    }

    return 0;
}

Output:

Enter any number = 12345
Reverse of no. is 54321

Enter any number = 1000000045
WARNING OVERFLOWED!!!

 

Recommended Articles for you: