Michael Porter
Michael Porter

Reputation: 229

Reversing numbers in C without using built in reverse function

I've been given a problem in class and to solve it I can't use the built in functions that already exist in c. It has to be an algorithm that performs the action. My function is below:

int reverseDigits(int userNumber)
{

    int rev1, rev2, rev3, rev4, reverseNumber;

    rev1 = userNumber/1000;

    rev2 = (userNumber - (rev1 * 1000)) / 100;

    rev3 = (userNumber - ((rev1 * 1000) + ( rev2 * 100))) / 10;

    rev4 = (userNumber - ((rev1 *1000) + (rev2 * 100) + (rev3 * 10))) / 1;


    if (rev1 == 0 && rev2 >= 1)
    {
        reverseNumber = ((rev2 *100) + (rev3 *10) + (rev1 * 1));
        return reverseNumber;
    }

    else if (rev2 == 0 && rev3 >= 1)
    {
        reverseNumber = ((rev3 * 10) + (rev1 * 1));
    }

    else if (rev3 == 0 && rev4 >= 1)
    {
        reverseNumber = (rev4 * 1);
    }

    else 
    {
        reverseNumber = ((rev4 * 1000) + (rev3 * 100) + (rev2 * 10) + (rev1 * 1));
        return reverseNumber;
    }


}

The function gets a user input and reverses it. My problem is that when given any number with less than 4 digits (It's only supposed to receive 4) the function returns them correctly but it adds zeros. For instance I send it 678 it will return 8760 or 57 would be 7500. Thanks for any help.

Upvotes: 2

Views: 1113

Answers (4)

R Sahu
R Sahu

Reputation: 206577

Errors in posted code

  1. The computation under the first if clause is wrong. Instead of

    reverseNumber = ((rev2 *100) + (rev3 *10) + (rev1 * 1));
    

    it needs to be

    reverseNumber = ((rev4 *100) + (rev3 *10) + (rev2 * 1));
    
  2. The computation under the first else if clause is wrong. Instead of

    reverseNumber = ((rev3 * 10) + (rev1 * 1));
    

    it needs to be

    reverseNumber = ((rev4 * 10) + (rev3 * 1));
    
  3. You are missing return statements in the two else if clauses. As a consequence, if your program gets into those clauses, no return statement is executed and the program has undefined behavior. You can resolve that by removing the return statements you have now and adding a return statement at the end.

    if (rev1 == 0 && rev2 >= 1)
    {
       reverseNumber = ((rev4 *100) + (rev3 *10) + (rev2 * 1));
    }
    else if (rev2 == 0 && rev3 >= 1)
    {
       reverseNumber = ((rev4 * 10) + (rev3 * 1));
    }
    else if (rev3 == 0 && rev4 >= 1)
    {
       reverseNumber = (rev4 * 1);
    }
    else 
    {
       reverseNumber = ((rev4 * 1000) + (rev3 * 100) + (rev2 * 10) + (rev1 * 1));
    }
    return reverseNumber;
    

A recursive solution

If you are able to use recursive functions, you can use:

int reverseDigits2(int userNumber, int res)
{
   if ( userNumber == 0 )
   {
      return res;
   }

   return reverseDigits2(userNumber/10, 10*res + (userNumber%10)); 
}

int reverseDigits(int userNumber)
{
   return reverseDigits2(userNumber, 0);
}

Upvotes: 0

Vlad from Moscow
Vlad from Moscow

Reputation: 310950

The problem is in the invalid set of if-else statements.

Using your approach the program can look like

#include <stdio.h>

int reverseDigits( int userNumber )
{

    int rev1, rev2, rev3, rev4, reverseNumber;

    rev1 = userNumber / 1000;

    rev2 = ( userNumber - ( rev1 * 1000 ) ) / 100;

    rev3 = ( userNumber - ( ( rev1 * 1000 ) + ( rev2 * 100 ) ) ) / 10;

    rev4 = ( userNumber - ( ( rev1 * 1000 ) + ( rev2 * 100 ) + ( rev3 * 10 ) ) ) / 1;


    if ( rev1 != 0 )
    {
        reverseNumber = ( rev1 * 1 ) + ( rev2 * 10 ) + ( rev3 * 100 ) + ( rev4 * 1000 ); 
    }
    else if ( rev2 != 0 )
    {
        reverseNumber = ( rev2 * 1 ) + ( rev3 * 10 ) + ( rev4 * 100 ); 
    }
    else if ( rev3 != 0  )
    {
        reverseNumber = ( rev3 * 1 ) + ( rev4 * 10 ); 
    }
    else 
    {
        reverseNumber = ( rev4 * 1 ); 
    }

    return reverseNumber;

}

int main( void ) 
{
    for ( unsigned int x = 0, n = 1000; n != 0; n /= 10 )
    {
        x += n;
        printf( "%d\t%d\n", x,  reverseDigits( x ) );
    }

    return 0;
}

Its output is

1000    1
1100    11
1110    111
1111    1111

Upvotes: 2

amaneureka
amaneureka

Reputation: 1150

This will work up to 9 digits.

int reverse(int num)
{
    int res = 0, tmp;
    while(num != 0)
    {
        tmp = num % 10;
        res = res*10 + tmp;
        num /= 10;
    }
    return res;
}

Upvotes: 6

powersource97
powersource97

Reputation: 403

This should do:

int main()
{
    int num,i=0;
    scanf("%d",&num);

    int digit[4]={0};
    int num_digits=0;

    while(num!=0)
    {
         digit[num_digits] = num%10;
         num = num/10;
         num_digits++;
    }

    for(i=0;i<num_digits;i++)
    {
        printf("%d",digit[i]);
    }

    return 0;
 }

This can help you edit any number, with any number of digits. Just increase the array size of digit.

Edit :Iterator mistaked edited.

Upvotes: 1

Related Questions