仅使用递归(无循环)在java中使用二进制到十进制

时间:2015-01-20 18:29:05

标签: java recursion

我似乎无法通过正确的方法将二进制数转换为十进制数。我相信我非常接近,事实上我想用一个字符串来保存二进制数来保存它然后重新编写我的方法只是使用.length来获取大小但我不知道如何实际做到这一点。有人可以帮我弄清楚我是如何使用字符串重写代码来保存二进制值,然后只使用递归而不是循环来获取十进制值?

这是我现在的完整代码,我不会忘记要求二进制文件的大小并使用字符串来自行解决。请帮助:)

package hw_1;
import java.util.Scanner;


public class Hw_1 {

    public static void main(String[] args) {

        int input;
        int size;
        Scanner scan = new Scanner(System.in);

        System.out.print("Enter decimal integer: ");
        input = scan.nextInt();
        convert(input);
        System.out.println();
        System.out.print("Enter binary integer and size : ");
        input = scan.nextInt();
        size = scan.nextInt();
        System.out.println(binaryToDecimal(input, size));

    }

    public static void convert(int num) {
        if (num > 0) {
            convert(num / 2);
            System.out.print(num % 2 + " ");
        }
    }

    public static int binaryToDecimal(int binary, int size) {
        if (binary == 0) {
            return 0;
        }
        return binary % 10
                * (int) Math.pow(2, size) + binaryToDecimal((int) binary / 10, size - 1);

    }
}

4 个答案:

答案 0 :(得分:1)

如果您希望使用String来保存二进制表示,可以使用以下内容:

public static int binaryToDecimal(String binaryString) {

    int size = binaryString.length();
    if (size == 1) {
        return Integer.parseInt(binaryString);
    } else {
        return binaryToDecimal(binaryString.substring(1, size)) + Integer.parseInt(binaryString.substring(0, 1)) * (int) Math.pow(2, size - 1);
    }

}

这是如何工作的,具有以下逻辑。如果,您发送的数字只有1个字符长,或者您到达递归工作的末尾,您将只返回该数字。例如,二进制中的1为十进制1,因此它将返回1。这就是

if (size == 1) {
        return Integer.parseInt(binaryString);
}

一样。第二部分(也是更重要的部分)可以分为两部分。 binaryString.substring(1, size)Integer.parseInt(binaryString.substring(0, 1)) * (int) Math.pow(2, size - 1)。在return语句中调用

binaryString.substring(1, size)

将除了第二个二进制数之外的所有数字传递回函数进行计算。例如,如果您有11001,则在第一个循环中,它会关闭第一个1并使用1001再次调用该函数。第二部分是,无论二进制表示头部位置编号的值是什么,都会增加总值。

Integer.parseInt(binaryString.substring(0, 1))

获取当前字符串中的第一个数字,

* (int) Math.pow(2, size - 1)

正在说Multiple that by 2 to the power of x, where x is the position that the number is in。再次使用我们的11001示例,第一个数字1位于二进制表示中的4位置,因此它将1 * 2^4添加到运行总计中。

如果您需要一种方法来测试它,我使用一个简单的主方法验证它:

public static void main(String args[]) {
    String binValue = "11001";
    System.out.println(binaryToDecimal(binValue));
}

希望这对你有意义。如果您需要更多帮助,请随时提出问题。

答案 1 :(得分:1)

这是一个改进的版本

package hw_1;
import java.util.Scanner;

public class Hw_1 {
  public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);
    System.out.print("Enter decimal integer : ");
    int input = scan.nextInt();
    convert(input);
    System.out.println();
    System.out.print("Enter binary integer : ");
    String binInput = scan.next();
    System.out.println(binaryToDecimal(binInput));
  }

  public static void convert(int num) {
    if (num>0) {
      convert(num/2);
      System.out.print(num%2 + " ");
    }
  }

  public static int binaryToDecimal(String binInput){  
    int len = binInput.length();
    if (len == 0) return 0;
    String now = binInput.substring(0,1);
    String later = binInput.substring(1);
    return Integer.parseInt(now) * (int)Math.pow(2, len-1) + binaryToDecimal(later);     
  }
}

答案 2 :(得分:0)

不要以相反的顺序解析二进制文件 通过调用binaryToDecimal(int),它将返回十进制数。

public static int binaryToDecimal(int binary) {
    return binaryToDecimal(binary, 0);
}

public static int binaryToDecimal(int binary, int k) {
    if (binary == 0) {
        return 0;
    }
    return (int) (binary % 10 * Math.pow(2, k) + binaryToDecimal(binary / 10, k + 1));
}

如果您只是为了转换数字而编码(不是为了练习)。然后更好的方法是使用Integer.parseInt(String, 2)。在这里,您必须以String

的形式传递二进制数

答案 3 :(得分:0)

这里是简洁简洁的递归算法;但是,您需要跟踪一些用于幂的全局变量,并且我已将其定义为静态成员。

static int pow = 0;

public static int binaryToDecimal(int binary) {
    if (binary <= 1) {
        int tmp = pow;
        pow = 0;
        return binary * (int) Math.pow(2, tmp);
    } else {
        return ((binary % 10) * (int) Math.pow(2, pow++)) + binaryToDecimal(binary / 10);
    }
}

注意:之所以介绍pow,是因为需要重置静态字段。