

-
------------------------------------------------------------------------------------------------------------------
(基礎練習第二題就難住了 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方法.
