为什么我的八进制到十进制转换器在某些情况下不起作用?

Why doesn't my octal-to-decimal converter work for certain cases?

我正在研究这个八进制到十进制的转换器:

public int getDecimal(String input)
{
    int output = 0;

    // reverse input so that it is easier to work with
    input = new StringBuilder(input).reverse().toString();

    for (int c = 0; c < input.length(); c++)
    {
        // check for invalid digit
        if (input.charAt(c) < '0' || input.charAt(c) > '7')
            return 0;

        if (input.charAt(c) != '0')
        {
            if (input.charAt(c) == '1')
                output += Math.pow(8, c);
            else // if it's greater than 1
                output += Math.pow(8, c) + input.charAt(c) - 1;
        }
    }

    return output;
}

它适用于大约 65% 的测试用例,例如将“10”转换为“8”。但是,它不适用于其他情况,例如将“17”转换为“15”。我做错了什么?

你需要记住“17”是什么意思:1 * 8 + 7。你的算法是错误的。您不需要反转字符串。对于循环中的每次迭代,只需将前一个 output 值乘以基数(在本例中为 8),然后添加下一个数字的值。继续直到字符串结束。

你的公式有误。

你在这条线上做什么,

output += Math.pow(8, c) + input.charAt(c) - 1;

应该更像,

output += Math.pow(8, c) * (input.charAt(c) - '0');

喜欢,output += 8^(index) * digit

你可以使用这个:

input = new StringBuilder(input).reverse().toString();

System.out.println("input:"+input);

for (int c = 0; c < input.length(); c++) {
    output += Integer.parseInt(input.charAt(c) + "") * Math.pow(8, c);

    System.out.println("output:" + output);
}
if (input.charAt(c) != '0')
{
    if (input.charAt(c) == '1')
        output += Math.pow(8, c);
    else // if it's greater than 1
        output += Math.pow(8, c) + input.charAt(c) - 1;
}

这里至少有两个错误。您可以将所有这些减少到

output = output*8+input.charAt(c)-'0';

去除反向步骤后。不用担心0和1的特殊情况。

你也可以试试这个,不需要反转字符串:

public static int getDecimal() {
    int output = 0;
    String input="17"; //by example
    int c=input.length();
    int i=0;
    while(c > 0) {
        if (input.charAt(i) < '0' || input.charAt(i) > '7') {
            return 0;
        }
        output += Math.pow(8, c-1) * Integer.parseInt(input.charAt(i++)+"");
        c--;
    }
    return output;
}