为什么我的八进制到十进制转换器在某些情况下不起作用?
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;
}
我正在研究这个八进制到十进制的转换器:
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;
}