藍橋網試題 java 基礎練習 十六進制轉八進制


-

------------------------------------------------------------------------------------------------------------------

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

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM