Java递归和整数两位数

时间:2011-03-08 00:22:19

标签: java recursion integer

我正在尝试将整数作为参数,然后使用递归来加倍整数中的每个数字。

例如doubleDigit(3487)会返回33448877

我被卡住了,因为我无法弄清楚如何读取数字中的每个数字。

5 个答案:

答案 0 :(得分:1)

要使用递归执行此操作,请使用模数运算符(%),每次除以10并向后累积结果字符串,直到达到基本情况(0),其中没有任何内容可以除以。在基本情况下,您只返回一个空字符串。

String doubleDigit(Integer digit) {

      if (digit == 0) {
        return "";
      } else {
        Integer thisDigit = digit % 10;
        Integer remainingDigits = (digit - thisDigit) / 10;
        return doubleDigit(remainingDigits) + thisDigit.toString() + thisDigit.toString();
      }
    }

答案 1 :(得分:1)

如果您正在寻找一个返回long而不是String的解决方案,您可以使用下面的解决方案(非常类似于Chris',假设0为基本情况):

long doubleDigit(long amt) {
    if (amt == 0) return 0;     
    return doubleDigit(amt / 10) * 100 + (amt % 10) * 10 + amt % 10;        
}

该函数当然受Java中的maximum size of a long限制。

答案 2 :(得分:1)

在构建Java程序时我做了同样的问题。这是我的解决方案,适用于负数和正数(并返回0表示0)。

public static int doubleDigits(int n) {
    if (n == 0) {
        return 0;
    } else {
        int lastDigit = n % 10;
        return 100 * doubleDigits(n / 10) + 10 * lastDigit + lastDigit;
}

答案 3 :(得分:0)

你可以获得给定整数的String.valueOf(doubleDigit)表示,然后使用Commons StringUtils(在我看来最简单)来操作String。

如果您需要在该点返回另一个数值(而不是新创建/操作的字符串),您可以执行Integer.valueOf(yourString)或类似的操作。

答案 4 :(得分:0)

这里不需要使用递归。

我不再是一个java人,但我可能使用的算法的近似值(在C#中工作,应该直接转换为java):

int number = 3487;
int output = 0;
int shift = 1;
while (number > 0) {
   int digit = number % 10;                 // get the least-significant digit       
   output += ((digit*10) + digit) * shift;  // double it, shift it, add it to output
   number /= 10;                            // move to the next digit
   shift *= 100;                            // increase the amount we shift by two digits
} 

这个解决方案应该可行,但是现在我已经遇到了编写它的麻烦,我意识到将数字转换为字符串并操纵它可能更清楚。当然,这会慢一点,但你几乎肯定不关心这么小的速度差异:)

修改 好的,所以你必须使用递归。你已经接受了一个非常好的答案,但这是我的:)

private static long DoubleDigit(long input) {       
    if (input == 0) return 0;                      // don't recurse forever!
    long digit = input % 10;                       // extract right-most digit
    long doubled = (digit * 10) + digit;           // "double" it
    long remaining = input / 10;                   // extract the other digits
    return doubled + 100*DoubleDigit(remaining);   // recurse to get the result
}

注意我已切换到long,因此可以使用更多数字。