Reputation: 229
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
Reputation: 206577
Errors in posted code
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));
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));
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
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
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
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