面试:兴业数金笔试,进制转换
题干
输入一个字符串,该字符串表示一个整数(可正可负)。该整数应该被转换为二进制和十六进制的数,最后用逗号衔接。二进制最多用十六位表示(首位0表示整数,1表示负数),十六进制四位表示。如果整数超过转换结果的限制,输出"NODATA";如果该输入不是一个整数,输出"INPUTERROR"。
分析
- 常规做法,整数除数求整、求余数。缺点,十六进制字符太过于麻烦。代码又臭又长。
- 取巧,利用Integer静态方法,toBinaryString和toHexString
代码实现
public class Main { public static String changeFormatNumber (String number) { try { int n = Integer.valueOf(number); StringBuilder sb = new StringBuilder(); String binaryS; String hexS; if(Math.abs(n) > Math.pow(2, 15) - 1){ System.out.print("NODATA"); }else { if(n >= 0){ return calculatePositiveNum(n, sb); }else { return sb.append(Integer.toBinaryString(n).substring(16)).append(,).append(Integer.toHexString(n).substring(4).toUpperCase()).toString(); } } }catch (NumberFormatException e){ System.out.print("INPUTERROR"); } return ""; } static String calculatePositiveNum(int n, StringBuilder sb) { String binaryS; String hexS; binaryS = Integer.toBinaryString(n); for(int i = 0,j = 16 - binaryS.length();i < j;i ++){ sb.append(0); } sb.append(binaryS).append(,); hexS = Integer.toHexString(n); for(int i = 0,j = 4 - hexS.length();i < j;i ++){ sb.append(0); } sb.append(hexS.toUpperCase()); return sb.toString(); } public static void main(String[] args) { System.out.println(changeFormatNumber("1322")); } }