2011-03-08 55 views
0

我试图把一个整数作为参数,然后使用递归将整数中的每个数字加倍。Java递归和整数双位数字

例如doubleDigit(3487)将返回33448877

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

+3

不知道为什么你想使用递归的.. ..? – Blorgbeard 2011-03-08 00:23:57

回答

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(); 
     } 
    } 
+0

这是完美的。这正是我正在寻找的!非常感谢你!我从来没有经常寻求编码方面的帮助,但是这个让我难住。非常感谢你! – Jeffrey 2011-03-08 01:19:12

0

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

如果你需要返回在这一点上的另一个数值(而不是新创建/操纵的字符串),你可以做Integer.valueOf(yourString)或类似的东西。

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所以多带几个数字作品。

+0

不幸的是我不得不使用递归,除此之外,你的代码是完美的,它的确有诀窍。我只是负责在这个上使用递归:/ – Jeffrey 2011-03-08 01:18:26

1

如果你正在寻找它返回一个长而不是一个字符串,你可以使用下面的下面的解决方案的解决方案(非常类似于克里斯,为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的限制。

0

在构建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; 
}