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==