簡體   English   中英

在不使用內置反向功能的情況下反轉C中的數字

[英]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錯誤編輯。

發布代碼中的錯誤

  1. 第一個if子句下的計算是錯誤的。 代替

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

    它需要

     reverseNumber = ((rev4 *100) + (rev3 *10) + (rev2 * 1)); 
  2. 第一個else if子句下的計算是錯誤的。 代替

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

    它需要

     reverseNumber = ((rev4 * 10) + (rev3 * 1)); 
  3. 您在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM