Photo by 愚木混株 cdd20 on Unsplash
Reversing a number in the C/C++ program means interchanging the digits i.e. to bring the last digit of the given number to the first position or vice versa.
As we know that reversing a number means interchanging the digits so that the last digit of the number comes first or vice versa.
Let us understand the same with the help of an example:-
Given input is 56897.
Then reverse of the given number would be 79865.
As we have understood what is meant by reversing a number, let us go further into understanding its algorithm.
Step 1. Let’s consider the given number to be num = 5689. Consider reverse number be rev_num =0.
Step 2. Now we will use the given formula, ie.
rev_num = rev_num*10 + num%10;
num = num / 10;
As we can see each time we are extracting the last digit of the given number and accommodate that last digit in rev_num by multiplying the same with 10.
To avoid extracting the same last digit from num, we will update num by dividing it by 10 and storing that value in num.
Step 3 . We will continue the procedure until the given number becomes less than or equal to 0.
Once we reached that stage then we have obtained our reverse number.
In the above example after the 5th iteration, we will obtain our reverse number ie 79865.
Digit extracted from num |
Multiplication with 10 i.e. rev_num |
---|---|
7 |
0*10+ 7 =7 |
9 |
7*10 +9 = 79 |
8 |
79*10+8 = 798 |
6 |
798*10+6=7986 |
5 |
7986*10+5=79865 |
Here we use 2 arithmetic operators namely modulo and division operator.
# include <stdio.h>
int main(){
int num, rev_num = 0 , rem ;
prinf("enter the number you wish to reverse:");
scanf ("%d",&num);
// using while loop and decreasing num till num >= 0
while (num != 0){
rem = num %10 ;
rev_num = (rev_num *10) + rem;
num = num/ 10 ; //updating the the number by dividing it by 10
}
printf ("reverse of the given number %d is : %d", num , rev_num);
return 0;
}
Output
enter the number you wish to reverse: 54689
reverse of the given number 54689 is : 98645
# include <stdio.h>
int reversenumber(int n, int revnum){
if (n==0) return revnum;
return reversenumber (n/10 , n % 10 + k*10);
}
int main(){
int num, rev_num ;
prinf("enter the number you wish to reverse");
scanf ("%d",&num);
//calling recursive function reversenumber
rev_num = reversenumber(num, 0);
printf ("reverse of the given number %d is : %d", num , rev_num);
return 0;
}
enter the number you wish to reverse: 54689
reverse of the given number 54689 is : 98645
revnum
represents the reverse of the given number.reversenumber
(n/10, n % 10 + k*10) with updated values of n and revnum
respectively
iteration |
Value of n |
Value of revnum |
Return Value |
---|---|---|---|
0 |
54689 |
0 |
return(54689,0) |
1 |
5468 |
9 |
return(5468,9) |
2 |
546 |
98 |
return(546,98) |
3 |
54 |
986 |
return (54,986) |
4 |
5 |
9864 |
return(5,9864) |
5 |
0 |
98654 |
as n==0, then we will simply return value of revnum = 98654 |
# include <stdio.h>
int revnumber( int n){
int rem , rev_num =0;
for (; n> 0; n= n/10){
rem = n%10 ;
rev_num = rev_num*10 + rem;
}
return rev_num;
}
int main(){
int num, rev_num = 0 ;
prinf("enter the number you wish to reverse:");
scanf ("%d",&num);
rev_num = revnumber (num);
printf ("reverse of the given number %d is : %d", num , rev_num);
return 0;
}
Output
enter the number you wish to reverse: 56897
reverse of the given number 54689 is : 79865
As we know that computer handles only binary numbers, unlike humans which can able to interpret multiple languages. The binary number representation of negative numbers is different from positive numbers.
Thus if we directly apply the above algorithm to a negative number then it will produce a wrong answer. To avoid such a case, we will multiply the said negative number with -1 to make it a positive number and then apply the algorithm to make it reverse, and after that, we will again multiply -1 to the reverse number.
Given code will help to better understand this.
# include <stdio.h>
# include <stdbool.h>
int main(){
int num, rev_num = 0 , rem ;
bool neg = false;
prinf("enter the number you wish to reverse:");
scanf ("%d",&num);
if (num < 0){
num = -num ;
neg = true;
}
// using while loop and decreasing num till num >= 0
while (num != 0){
rem = num %10 ;
rev_num = (rev_num *10) + rem;
num = num/ 10 ; //updating the the number by dividing it by 10
}
if (neg){
num = - num;
}
printf ("reverse of the given number %d is : %d", num , rev_num);
return 0;
}
As we know integer can handle up to 32 bits. It may so happen that the reverse of the number may exceed or overflow 32 bit. In such a case check every time whether the reverse number exceeds the 32 bit.
The Below code provides a better understanding.
# include <stdio.h>
int revnumber( int n){
int rem , rev_num =0, prev_num = 0;
while (n ! =0 ){
rem = n%10 ;
prev_num = (rev_num) *10 + rem;
if ((prev_num - rem )/10 != rev){
printf("WARNING REVERSE NUMBER IS OVERFLOWED!!!");
return 0;
}
else rev_num = prev_num;
n= n/10;
}
return rev_num;
}
int main(){
int num, rev_num = 0 ;
prinf("enter the number you wish to reverse:");
scanf ("%d",&num);
rev_num = revnumber (num);
if (rev_num != 0){
printf ("reverse of the given number %d is : %d", num , rev_num);
}
return 0;
}
In this code, we have checked if the reverse number is overflowed. In case of overflowing, rev_num would contain garbage value, which is not going to be equal to (prev_num - rem)/10.
While loop or recursive function executes the program for the number of digits present in number. A number of digits in number num have the computing of log (num) to base 10. So time complexity is O(log10(num)).
We have not used any extra space. Thus space complexity is O(1).
In this article, we have seen the algorithm of reversing a number and different methods through which it can be implemented in a C-like loop, recursive.
Along with it can we have seen some corner cases like if given input is negative or reverse of a number exceeds 32 bit.
To further enhance your knowledge on reversing a number and its usage with beautiful schematics, one may want to have a look at this curated article published on the C Program to Reverse a Number on Scaler topics.