所以这是我到目前为止所做的,但它向后打印出十六进制。如何将其切换为前进或者是否有更简单的方法将整数转换为HexDecimal而不是我做的。这是一项家庭作业,我不允许使用数组或预定义方法(I.E。toHexString())。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
int num = scn.nextInt();
int remainder;
while (num > 0) {
remainder = num % 16;
if (remainder == 10) {
System.out.print("a");
} else if (remainder == 11) {
System.out.print("b");
} else if (remainder == 12) {
System.out.print("c");
} else if (remainder == 13) {
System.out.print("d");
} else if (remainder == 14) {
System.out.print("e");
} else if (remainder == 15) {
System.out.print("f");
} else {
System.out.print(remainder);
}
num = num / 16;
}
}
}
答案 0 :(得分:4)
您可以使用recursion。
public static void printNum(int curr) {
if (curr == 0) {
return;
}
else {
int divided = curr / 16;
int remainder = curr % 16;
printNum(divided);
printDigit(remainder);
}
}
// print a digit where digit is in range [0, 16)
public static void printDigit(int digit) { ... }
这里的想法是你最后打印最大的数字。为此,您可以反复调用相同的功能,每次将数字减少一位数。每次进入该功能时,都要检查是否满足结束条件(没有更多数字)。这称为tail-first recursion。一旦满足这个条件,你就会重新启动方法调用链,每次打印下一个最高位数。
例如,输入1337
将如下所示:
depth 0: divided = 1337 / 16 = 83, remainder = 9
depth 1: divided = 83 / 16 = 5, remainder = 3
depth 2: divided = 5 / 16 = 0, remainder = 5
depth 3: end condition met
print remainder = 5
print remainder = 3
print remainder = 9
打印539
答案 1 :(得分:2)
如果你想进入非递归路由,在进入循环并构建它之前声明String
,而不是每次循环迭代打印到System.out
:
String output = "";
while (num > 0) {
remainder = num % 16;
if (remainder == 10) {
output = "a" + output;
} else if (remainder == 11) {
output = "b" + output;
} else if (remainder == 12) {
output = "c" + output;
} else if (remainder == 13) {
output = "d" + output;
} else if (remainder == 14) {
output = "e" + output;
} else if (remainder == 15) {
output = "f" + output;
} else {
output = remainder + output;
}
num = num / 16;
}
System.out.println(output);
答案 2 :(得分:0)
迭代解决方案(仅适用于正整数):
public static String toHex(int value) {
if (value == 0)
return "0";
StringBuffer result = new StringBuffer();
while (value > 0) {
int x = value & 0b1111;
char hex = (char) (x < 10 ? '0' + x : 'A' + x - 10);
result.insert(0, hex);
value >>= 4;
}
return result.toString();
}
说明:
StringBuffer
有助于连接字符串和字符。它允许
通过插入第一个位置(插入0)来预推送。 这应该是最有效的解决方案。 如果您还需要支持负整数,则还需要实现Two's complement。
顺便说一下,永远不会忘记测试:在这种情况下,蒙特卡罗 JUnit可以探测随机整数并比较框架实现(Integer.toHexString(value).toUpperCase()
)使用自定义实现:
@Test
public void testHex() {
Random random = ThreadLocalRandom.current();
for (int i = 0; i < 1000000; i++) {
int value = random.nextInt();
if (value >= 0) {
Assert.assertEquals(Integer.toHexString(value).toUpperCase(), toHex(value));
}
}
}