[英]Reversing numbers in C without using built in reverse function
我在課堂上遇到了問題,為了解決這個問題,我不能使用c中已經存在的內置函數。 它必須是執行操作的算法。 我的功能如下:
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;
}
}
該函數獲取用戶輸入並將其反轉。 我的問題是,當給出任何小於4位數的數字(它只應該接收4位數)時,該函數會正確返回它們,但它會添加零。 例如,我發送它678它將返回8760或57將是7500.感謝您的幫助。
這最多可以達到9位數。
int reverse(int num)
{
int res = 0, tmp;
while(num != 0)
{
tmp = num % 10;
res = res*10 + tmp;
num /= 10;
}
return res;
}
問題出在if-else語句的無效集合中。
使用您的方法,程序可以看起來像
#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;
}
它的輸出是
1000 1
1100 11
1110 111
1111 1111
這應該做:
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;
}
這可以幫助您編輯任意數字,任意數字。 只需增加digit
的數組大小。
編輯:Iterator錯誤編輯。
發布代碼中的錯誤
第一個if
子句下的計算是錯誤的。 代替
reverseNumber = ((rev2 *100) + (rev3 *10) + (rev1 * 1));
它需要
reverseNumber = ((rev4 *100) + (rev3 *10) + (rev2 * 1));
第一個else if
子句下的計算是錯誤的。 代替
reverseNumber = ((rev3 * 10) + (rev1 * 1));
它需要
reverseNumber = ((rev4 * 10) + (rev3 * 1));
您在else if
兩個else if
子句中缺少return
語句。 因此,如果您的程序進入這些子句,則不會執行return
語句,並且程序具有未定義的行為。 您可以通過刪除解決return
現在你有陳述和添加return
在最后陳述。
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;
遞歸解決方案
如果您能夠使用遞歸函數,則可以使用:
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.