简体   繁体   中英

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.

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;
}

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

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.

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);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM