使用递归来反转整数而不使用字符串

时间:2013-12-18 23:13:10

标签: java recursion integer

我现在已经尝试了一段时间,但无法让它发挥作用。我试图有一个方法来反转整数而不使用字符串或数组。例如,123应以整数形式反转为321。

我的第一次尝试:

/** reverses digits of integer using recursion */
public int RevDigs(int input)
{
    int reverse = 0;
    if(input == 0)
    {
        return reverse;
    }
    int tempRev = RevDigs(input/10);
    if(tempRev >= 10)
        reverse = input%10 * (int)Math.pow(tempRev/10, 2) + tempRev;
    if(tempRev <10 && tempRev >0)
        reverse = input%10*10 + tempRev;
    if(tempRev == 0)
        reverse = input%10;   
    return reverse;
}//======================

我也尝试过使用它,但它似乎弄乱了中间数字:

/** reverses digits of integer using recursion */
public int RevDigs(int input)
{
    int reverse = 0;
    if(input == 0)
    {
        return reverse;
    }
    if(RevDigs(input/10) == 0)
        reverse = input % 10;
    else
    {
        if(RevDigs(input/10) < 10)
            reverse = (input % 10) *10 + RevDigs(input/10);
        else
            reverse = (input % 10)* 10 * (RevDigs(input/10)/10 + 1) + RevDigs(input/10);
        }
    return reverse;
}

我试过在网站上查看一些示例,但是我无法让它们正常工作。为了进一步说明,我不能为这个项目使用String或数组,并且必须使用递归。有人可以帮我解决问题。谢谢。

5 个答案:

答案 0 :(得分:6)

如何使用两种方法

public static long reverse(long n) {
    return reverse(n, 0);
}

private static long reverse(long n, long m) {
    return n == 0 ? m : reverse(n / 10, m * 10 +  n % 10);
}

public static void main(String... ignored) {
    System.out.println(reverse(123456789));
}

打印

987654321

答案 1 :(得分:5)

怎么样:

public int RevDigs(int input) {
    if(input < 10) {
        return input;
    }
    else {
        return (input % 10) * (int) Math.pow(10, (int) Math.log10(input)) + RevDigs(input/10);
        /* here we:
           - take last digit of input
           - multiply by an adequate power of ten
             (to set this digit in a "right place" of result)
           - add input without last digit, reversed
        */
    }
}

当然,这假定为input >= 0

答案 2 :(得分:3)

使用递归的关键是注意到您尝试解决的问题包含相同问题的较小实例。在这里,如果您试图反转数字13579,您可能会注意到通过反转3579(相同的问题但更小),将结果乘以10,然后加1(您起飞的数字)可以使问题变小)。或者你可以反转数字1357(递归),给出7531,然后将9 *(一些10的幂)加到结果中。第一个棘手的问题是你必须知道何时停止(当你有一位数时)。第二件事是,对于这个问题,你必须弄清楚这个数字的位数,这样你才能获得10的权力。你可以使用Math.log10,或者你可以使用一个以1开头并乘以10的循环,直到它大于你的数字。

答案 3 :(得分:0)

package Test;

public class Recursive {
    int i=1;
    int multiple=10;
    int reqnum=0;
    public int recur(int no){
        int reminder, revno;

        if (no/10==0) {reqnum=no;
        System.out.println(" reqnum "+reqnum);
        return reqnum;}
        reminder=no%10;
        //multiple =multiple * 10;
        System.out.println(i+" i multiple "+multiple+" Reminder "+reminder+" no "+no+" reqnum "+reqnum);
        i++;

        no=recur(no/10);
        reqnum=reqnum+(reminder*multiple);
        multiple =multiple * 10;
        System.out.println(i+" i multiple "+multiple+" Reminder "+reminder+" no "+no+" reqnum "+reqnum);
        return reqnum;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int num=123456789;

        Recursive r= new Recursive();
        System.out.println(r.recur(num));
    }

}

答案 4 :(得分:0)

import java.io.*;

public class ReversalOfNumber {
    public static int sum =0;
    public static void main(String args []) throws IOException
    {
        System.out.println("Enter a number to get Reverse & Press Enter Button");
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String input = reader.readLine();
        int number = Integer.parseInt(input);
        int revNumber = reverse(number);
        System.out.println("Reverse of "+number+" is: "+revNumber);
    }
    public static int reverse(int n)
    {       
        int unit;
        if (n>0)
        {
            unit = n % 10;
            sum= (sum*10)+unit;
            n=n/10;
            reverse(n);
        }
        return sum;
    }
}