-
------------------------------------------------------------------------------------------------------------------
(基础练习第二题就难住了 QAQ)
这道题的限制比较多,因为最开始说的是十六进制数的长度不超过100000,
而long类型才十九位,肯定不能用系统自带的进制转换方法,需要自己写
------------------------------------------------------------------------------------------------------------------
算法
1 import java.util.*; 2 public class Main{ 3 public static void main(String[] args) { 4 Scanner sc = new Scanner(System.in); 5 int n = sc.nextInt(); 6 String[] sts = new String[n]; 7 for(int i=0;i<n;i++){ 8 sts[i] = sc.next(); 9 } 10 sc.close(); 11 for(int i=0;i<n;i++){ 12 String strBinary = toBinary(sts[i]); 13 int len_strBin = strBinary.length(); 14 if(len_strBin%3==1) strBinary = "00"+strBinary; 15 if(len_strBin%3==2) strBinary = "0"+strBinary; 16 String strOctal = toOctal(strBinary); 17 System.out.println(strOctal); 18 } 19 } 20 private static String toOctal(String strBinary) { 21 int len = strBinary.length(); 22 int k; 23 StringBuffer stb = new StringBuffer(); 24 if(strBinary.substring(0, 3).equals("000")) 25 k=3; 26 else 27 k=0; 28 for(int i=k;i<len-2;i+=3){ 29 switch (strBinary.substring(i, i+3)) { 30 case "000":stb.append("0");break; 31 case "001":stb.append("1");break; 32 case "010":stb.append("2");break; 33 case "011":stb.append("3");break; 34 case "100":stb.append("4");break; 35 case "101":stb.append("5");break; 36 case "110":stb.append("6");break; 37 case "111":stb.append("7");break; 38 default:break; 39 } 40 } 41 return stb.toString(); 42 } 43 private static String toBinary(String strHex) { 44 int len_str = strHex.length(); 45 StringBuffer stb = new StringBuffer(); 46 for(int i=0;i<len_str;i++){ 47 switch (strHex.charAt(i)) { 48 case '0':stb.append("0000");break; 49 case '1':stb.append("0001");break; 50 case '2':stb.append("0010");break; 51 case '3':stb.append("0011");break; 52 case '4':stb.append("0100");break; 53 case '5':stb.append("0101");break; 54 case '6':stb.append("0110");break; 55 case '7':stb.append("0111");break; 56 case '8':stb.append("1000");break; 57 case '9':stb.append("1001");break; 58 case 'A':stb.append("1010");break; 59 case 'B':stb.append("1011");break; 60 case 'C':stb.append("1100");break; 61 case 'D':stb.append("1101");break; 62 case 'E':stb.append("1110");break; 63 case 'F':stb.append("1111");break; 64 default:break; 65 } 66 } 67 return stb.toString(); 68 } 69 }
要注意小细节,十六进制每一位 对应4位二进制数,八进制对应3位二进制数,十六进制生成二进制后,
在转化八进制前,要查看长度是不是三的倍数,如果不是,则用0补齐.之后在转化八进制开始要判断
开头的三个是不是"000"的形式,如果是则不算在八进制数里.
1 int len_strBin = strBinary.length(); 2 if(len_strBin%3==1) strBinary = "00"+strBinary; 3 if(len_strBin%3==2) strBinary = "0"+strBinary; 4 String strOctal = toOctal(strBinary);
做好这类题目要学会去发现什么是变的 什么是不变的 不要试图全部用算法去实现,这样只会事倍功半.
StringBuffer适合定义一个经常变的字符串变量,使用StringBuilder 效率更高效
熟练使用charAt,append,substring方法.