尝试将Integer转换为HexDecimal而不使用Java中的方法或数组

时间:2016-09-23 19:11:23

标签: java

所以这是我到目前为止所做的,但它向后打印出十六进制。如何将其切换为前进或者是否有更简单的方法将整数转换为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;
    }
  }
}

3 个答案:

答案 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();
}

说明:

  • 除以16的余数产生最低的十六进制数字。代替 除以16,您还可以执行二进制位屏蔽(&amp; 15,其中 是0b1111)到提取最低4位
  • 要将此数字(0..15)转换为十六进制数字(0..F),如果它更低,请将其添加到字符'0' 超过10,否则减去10并将其添加到'A'。
  • 每次迭代后,除以16或更好:右移4位
  • StringBuffer有助于连接字符串和字符。它允许 通过插入第一个位置(插入0)来预推送
  • 当数字为0时,结果字符串将为空。相反,我们回来 数字“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));
        }
    }
}