使用包含使用二进制的基础的Modify.java赋值有问题

时间:2016-12-11 01:42:56

标签: java binary

需要有关某个Java.Binary代码流程的帮助

这是赋值:修改Binary.java以获取一个程序Modify.java,它接受第二个命令行参数K并将第一个参数转换为基数K.假设基数在2到16之间。对于大于2的基数10,使用字母A到F分别代表第11到第16位。

可以在此处找到Binary.java程序:http://introcs.cs.princeton.edu/java/13flow/Binary.java

有谁知道如何解决这个问题?我已经在这段代码上工作了一段时间,但我对编码很新,所以我需要一些帮助来完成这个项目。

这是我到目前为止所做的:

public class Modify {
      public static void main(String[] args) {
        int a = Integer.parseInt(args[0]);
        int b = Integer.parseInt(args[1]);
        int c = 1;
        int d = 0;
        int e;
        String answer = "";
        boolean term;
        do {
          c *= b;
          if (a >= c) {
            term = true;
            d += 1;
          } else {
            term = false;
          }
        } while (term);
        while (!(a == 0)) {
          int g = 1;
          for (int i = 0; i < d; i++) {
            g *= b;
          }
          d--;
          e = (a / g);
          if (e >= 10) {
            switch (e) {
              case 10:
                answer = answer + "a";
                break;
              case 11:
                answer = answer + "b";
                break;
              case 12:
                answer = answer + "c";
                break;
              case 13:
                answer = answer + "d";
                break;
              case 14:
                answer = answer + "e";
                break;
              case 15:
                answer = answer + "f";
                break;
            }
          } else {
            answer = answer + e;
          }
          a -= g;
        }
        System.out.println(answer);
      }
    }

1 个答案:

答案 0 :(得分:0)

numeral systems简介:
我们可以写任何数字x:

x = a1 * r^0 + a2 * r^1 + a3 * r^2 + ...

其中r是基数(在您的问题K中)。这个公式是例如:

x = 13
r = 2

x = 1 * 2^0 + 0 * 2^1 + 1 * 2^2 + 1 * 2^3

x as binary = 1101

这可以用于任何基数。

获取数字列表

为了以任何格式显示数字,我们需要获取[a1, a2, ...]的列表。首先,我们重写上面的公式:

x = a1 * r^0 + a2 * r^1 + a3 * r^2 + ...
x = a1 + r * (a2 + r* (a3 + r * (...)))
显然很明显:

a1 = x % r
a2 = (x - a1) / r % r 
   or a2 = x / r & % r relying on the integer-division as implemented in  java
a3 = x / r^2 % r
...

an = x / r^(n - 1)%r

an == 0成立时,此序列会中断。

这可以通过以下方式实施:

list a
while x != 0
    a.add(x % r)
    x /= r

完成后a是列表[a1, a2, ...]

提供的链接中的代码基本上以相反的方式(从最高位开始到最低位),这解决了保持数字列表的问题。该代码的翻译如下所示:

pow = floor(log(K, x))

while pow > 0
    digit = floor(x / pow)
    print(digit)

    x -= digit * pow
    pow /= K

将数字作为整数值转换为相应的字符

使用ASCII的一些属性可以完成将数字转换为字符(java实际上使用unicode,但对于这个无关紧要的问题)。字符只是一个以不同方式解释的数字。例如。 'A' == 64将返回true。所有十进制数字都按升序排序,字符按字母顺序排序。所以我们可以用它来构建我们的表:

digitToChar(digit)
    if digit < 10
        return '0' + digit
    else
        return 'A' + digit - 10

或者,我们可以构建一个表并在该表上进行查找。由于我们只需要支持16位,我们需要一个表格来表示基数为16的数字:

digitRep = {'0', '1', '2', '3', ..., '8', '9', 'A', 'B', ..., 'F'}
digitToChar(digit)
    return digitRep[digit]

或者您可以使用代码中使用的switch语句。

全部放在一起

最后,基于链接中提供的代码的实际实现如下所示:

static final char[] table = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', 
                                        '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

public static void main(String[] args) { 
    //read parameters
    int x = Integer.parseInt(args[0]);
    int k = Integer.parseInt(args[1]);

    // set power to the largest power of K that is <= n
    int power = 1;
    while (power <= x/k) {
        power *= k;
    }

    while (power > 0) {
        //retrieve and print the next digit from x
        int digit = x / power;
        System.out.print(table[digit]);

        //update variables for next loop-run
        x -= digit * power;
        power /= k;
    }

    System.out.println();
}