在不使用内置反向功能的情况下反转C中的数字

时间:2016-06-21 14:56:46

标签: c

我在课堂上遇到了问题,为了解决这个问题我不能使用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.感谢您的帮助。

4 个答案:

答案 0 :(得分:6)

这最多可以达到9位数。

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

答案 1 :(得分:2)

问题出在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

答案 2 :(得分:1)

这应该做:

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错误编辑。

答案 3 :(得分:0)

发布代码中的错误

  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. 您在两个return子句中缺少else if个语句。因此,如果您的程序进入这些子句,则不会执行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;
    
  4. 递归解决方案

    如果您能够使用递归函数,则可以使用:

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