我正在尝试将整数作为参数,然后使用递归来加倍整数中的每个数字。
例如doubleDigit(3487)
会返回33448877
。
我被卡住了,因为我无法弄清楚如何读取数字中的每个数字。
答案 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
,因此可以使用更多数字。