我在课堂上遇到了问题,为了解决这个问题我不能使用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.感谢您的帮助。
答案 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)
发布代码中的错误
第一个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));
您在两个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;
递归解决方案
如果您能够使用递归函数,则可以使用:
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);
}