蓝桥网试题 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方法.

 

 

 

 

 

原文地址:https://www.cnblogs.com/loveluking/p/6055385.html