我完全被这个问题困住了。我必须利用当前的代码结构,使用递归将用户输入的十六进制值转换为十进制值。无法更改递归调用的方法标头。我没有使用递归计算出来,但是对于我的生活来说,我无法理解我将如何做到这一点。
//编辑 - 已解决
public class hextodecimal {
public static void main(String[] args) {
// Test out the parsing with values from page 719
System.out.println(hexToDecimal("7F"));
System.out.println(hexToDecimal("FFFF"));
System.out.println(hexToDecimal("431"));
}
public static int hexToDecimal(String hexString) {
return hexToDecimal(hexString, 0, hexString.length() - 1);
}
public static int hexToDecimal(String hexString, int end, int hexLength) {
if (hexLength < end)
return 0;
else {
int decValue;
if (hexString.charAt(hexLength) == 'A')
decValue = 10;
else if (hexString.charAt(hexLength) == 'B')
decValue = 11;
else if (hexString.charAt(hexLength) == 'C')
decValue = 12;
else if (hexString.charAt(hexLength) == 'D')
decValue = 13;
else if (hexString.charAt(hexLength) == 'E')
decValue = 14;
else if (hexString.charAt(hexLength) == 'F')
decValue = 15;
else
decValue = hexString.charAt(hexLength) - '0';
return hexToDecimal(hexString, end, hexLength - 1) * 16
+ decValue;
}
}
}
答案 0 :(得分:2)
只有两个选择。处理最左边的char,并递归地将substring(1)传递给自己,或处理最右边的char,并递归地向左传递什么。这应该是一个暗示。
答案 1 :(得分:2)
假设您必须使用递归,并且您无法使用Integer.parseInt()
(您已经知道并且会破坏询问的目的)问题),你可以这样做:
创建递归函数时,需要一个终止条件,以及一种达到终止条件的方法。由于您显然必须使用该方法签名,因此在每次递归后传递{1}}少1个字符后,您的终止条件必须为hexString
为空。
如果String
为空,则返回0是有意义的(如果您先阅读以下内容可能更有意义。)
您应该每次处理最重要的数字,并将解析后的值乘以hexString
。 16因为十六进制是基数16,并且将其提升到数字位置的幂 - 1,出于同样的原因,一旦你有数字和它的位置(即数十,数百,数千),你将以十进制为10 ^ X. 16 ^ (length_of hexString - 1)
的长度为我们提供了这个位置。 如果您不明白我的意思,请查看底部的示例。
现在你需要一种解析这个角色的方法。一种简单的方法是使用String
将每个十六进制Map
映射到其十进制表示的char
,但您也可以使用int
或if
语句。如果switch
不是有效的十六进制数字,则抛出异常。
获得此值后,将其添加到char
的返回值,即。 hexToDecimal
。传递给value + hexToDecimal()
的{{1}}是修改为范围String
的当前字符串,其中(如上所述)第一个字符被删除。
注意:想一想为什么不能使用该方法签名从最低位数(右)处理。你怎么能根据它的位置乘以十六进制数字来给它正确的值?
即。 hexToDecimal
,十进制为127。
数字不 7 + 15,但是7 *(16 ^ 1)+ 15!
答案 2 :(得分:1)
RTFM!这是javadoc for Integer.parseInt(String, int)的增强摘录:
答案 3 :(得分:1)
我认为这里的关键是要意识到每个数字的重要性。例如,十六进制中的F00D
是:
F * (16 ^ 3) //Fourth digit
plus
0 * (16 ^ 2) //Third digit
plus
0 * (16 ^ 1) //Second digit
plus
D * (16 ^ 0) //First digit
换句话说:
(15 * (16^3)) + 0 + 0 + 13
或者:
61440 + 0 + 0 + 13 = 61453
所以在每一步中,你都会在序列中将它提升到16位。
您可以使用字符串的长度来确定您所在的位置,并将剩余的数字传递给下一次迭代。每个函数将以递归方式添加到结果中。
例如:
F00D
并返回61440 + hexToDecimal("00D")
00D
并返回0 + hexToDecimal("0D")
0D
并返回0 + hexToDecimal("D")
D
并返回13
,而不再调用自身,因为字符串的长度为1。现在只是编写代码! :)
答案 4 :(得分:0)
如果它是1位十六进制数(0-F),那么它很容易解析。你可以用开关来做。
如果它是n> 1位十六进制数,则它太难了。将其分为两个数字 - 一个n-1位数字和一位数字。