class Test {
private static String toDecimal
(String hex,
int numberDigits
) { /* converts a string such as "13.1a" in base 16 to "19.1015625" in base 10 */
int index = hex.indexOf('.');
assert index != -1;
StringBuilder decimal
= new StringBuilder
((index
== 0) ? "" : String.
valueOf(Integer.
parseInt(hex.
substring(0, index
),
16))); decimal.append('.');
int l = hex.length() - index - 1;
assert l >= 1;
int firstIndex = index + 1;
int hexDigits[] = new int[l];
for (int i = 0; i < l; i++) {
hexDigits
[i
] = Integer.
parseInt(hex.
substring(i
+ firstIndex, i
+ firstIndex
+ 1),
16); }
while (numberDigits != 0 && l != 0) {
int carry = 0;
boolean allZeroes = true;
for (int i = l - 1; i >= 0; i--) {
int value = hexDigits[i] * 10 + carry;
if (value == 0 && allZeroes) {
l = i;
}
else {
allZeroes = false;
carry = (int)(value / 16);
hexDigits[i] = value % 16;
}
}
numberDigits--;
if (carry != 0 || (numberDigits != 0 && l != 0))
decimal.append("0123456789".charAt(carry));
}
return decimal.toString();
}
public static void main
(String[] args
) { System.
out.
println(toDecimal
("13.1a",
15)); System.
out.
println(toDecimal
("13.8",
15)); System.
out.
println(toDecimal
("13.1234",
15)); }
}
Y2xhc3MgVGVzdCB7CgogICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvRGVjaW1hbChTdHJpbmcgaGV4LCBpbnQgbnVtYmVyRGlnaXRzKSB7CiAgICAgICAgLyogY29udmVydHMgYSBzdHJpbmcgc3VjaCBhcyAiMTMuMWEiIGluIGJhc2UgMTYgdG8gIjE5LjEwMTU2MjUiIGluIGJhc2UgMTAgKi8KICAgICAgICBpbnQgaW5kZXggPSBoZXguaW5kZXhPZignLicpOwogICAgICAgIGFzc2VydCBpbmRleCAhPSAtMTsKICAgICAgICBTdHJpbmdCdWlsZGVyIGRlY2ltYWwgPSBuZXcgU3RyaW5nQnVpbGRlcigoaW5kZXggPT0gMCkgPyAiIiA6IFN0cmluZy52YWx1ZU9mKEludGVnZXIucGFyc2VJbnQoaGV4LnN1YnN0cmluZygwLCBpbmRleCksIDE2KSkpOwogICAgICAgIGRlY2ltYWwuYXBwZW5kKCcuJyk7CiAgICAgICAgaW50IGwgPSBoZXgubGVuZ3RoKCkgLSBpbmRleCAtIDE7CiAgICAgICAgYXNzZXJ0IGwgPj0gMTsKICAgICAgICBpbnQgZmlyc3RJbmRleCA9IGluZGV4ICsgMTsKICAgICAgICBpbnQgaGV4RGlnaXRzW10gPSBuZXcgaW50W2xdOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgIGhleERpZ2l0c1tpXSA9IEludGVnZXIucGFyc2VJbnQoaGV4LnN1YnN0cmluZyhpICsgZmlyc3RJbmRleCwgaSArIGZpcnN0SW5kZXggKyAxKSwgMTYpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAobnVtYmVyRGlnaXRzICE9IDAgJiYgbCAhPSAwKSB7CiAgICAgICAgICAgIGludCBjYXJyeSA9IDA7CiAgICAgICAgICAgIGJvb2xlYW4gYWxsWmVyb2VzID0gdHJ1ZTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IGwgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgaW50IHZhbHVlID0gaGV4RGlnaXRzW2ldICogMTAgKyBjYXJyeTsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAwICYmIGFsbFplcm9lcykgewogICAgICAgICAgICAgICAgICAgIGwgPSBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYWxsWmVyb2VzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgY2FycnkgPSAoaW50KSh2YWx1ZSAvIDE2KTsKICAgICAgICAgICAgICAgICAgICBoZXhEaWdpdHNbaV0gPSB2YWx1ZSAlIDE2OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG51bWJlckRpZ2l0cy0tOwogICAgICAgICAgICBpZiAoY2FycnkgIT0gMCB8fCAobnVtYmVyRGlnaXRzICE9IDAgJiYgbCAhPSAwKSkKICAgICAgICAgICAgICAgIGRlY2ltYWwuYXBwZW5kKCIwMTIzNDU2Nzg5Ii5jaGFyQXQoY2FycnkpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRlY2ltYWwudG9TdHJpbmcoKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRvRGVjaW1hbCgiMTMuMWEiLCAxNSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0b0RlY2ltYWwoIjEzLjgiLCAxNSkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0b0RlY2ltYWwoIjEzLjEyMzQiLCAxNSkpOwogICAgfQoKfQ==