下面给出的代码适用于两位数的数字,也就是说,高达99,但我不知道为什么它打破后。例如。它给51作为输出的数字123,但它应该是321。有人能帮助我吗?
public class Main
{
static int reverse(int n){
if(n<10)
return n;
else
return ((n%10)*10)+(reverse(n/=10));
}
public static void main(String[] args) {
System.out.println(reverse(123));
}
}
5条答案
按热度按时间r6l8ljro1#
对于n = 123:
n % 10 * 10
得到30。接下来,将n
除以10,得到12,并将其传递到递归调用中。由于您的方法对两位数正确工作,因此得到21。30 + 21等于51。一个只使用数学的递归方法(相对于字符串操作)并不简单,我想我会求助于迭代的解决方案,如果你想用这个问题来训练递归,你可能应该看看azro已经建议的字符串操作。
为了说明结合数学和递归所面临的挑战,请考虑如何反转102。预期为201。有两种方法:
1.你可以将10传递给递归调用,并将结果附加到2。10的逆是01,你将得到1,所以简单的解决方案将给予你21,而不是201。可能有一种方法可以知道递归调用的中间结果应该被理解为两位数,你需要创造性。
1.或者你把02传递给一个递归调用,并把1附加到结果上。同样,这种简单的方法会产生21,而不是201。
zzzyeukh2#
你在做数学加法,使用字符串连接会更容易
pprl5pva3#
你只能反向清零最后一位数字。这只适用于小于100的数字(用一个递归调用)。
8aqjt8rx4#
问题出在
((n%10)*10)+
上。这部分应该把最后一位数和反数连接起来,但它只是把数字乘以10并求和。对于两位数,它是有效的,因为乘以10实际上是把第二位的数字放在第一位。但它对大于10的数字不起作用。您应该改为连接字符串。
uajslkp65#
如果你想要一个纯粹的数学基础上的解决方案,你可以这样做。
div
是10的当前位数的幂。