需要有关某个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);
}
}
答案 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();
}