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

     

     

     

     

     

  • 相关阅读:
    C++实现多项式曲线拟合--polyfit-超定方程
    C# XmlDocument操作XML
    C#下使用XmlDocument详解
    前端常见的9种设计模式
    前端常用的设计模式
    前端需要了解的9种设计模式
    TCP协议详解
    请UI小姐姐喝了一杯奶茶要来的网站
    nodemon 基本配置与使用
    wireshark抓包新手使用教程
  • 原文地址:https://www.cnblogs.com/loveluking/p/6055385.html
Copyright © 2020-2023  润新知