基礎練習 十六進制轉八進制

問題描述
  給定n個十六進制正整數,輸出它們對應的八進制數。

輸入格式
  輸入的第一行爲一個正整數n (1<=n<=10)。
  接下來n行,每行一個由0~9、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。

輸出格式
  輸出n行,每行爲輸入對應的八進制正整數。

  【注意
  輸入的十六進制數不會有前導0,比如012A。
  輸出的八進制數也不能有前導0。

樣例輸入
  2
  39
  123ABC

樣例輸出
  71
  4435274

  提示
  先將十六進制數轉換成某進制數,再由某進制數轉換成八進制。

 


/*
需求:給定n個十六進制正整數,輸出它們對應的八進制數。

思路:先將輸入的十六進制字符串轉換成二進制字符串,再由二進制字符串轉換成八進制字符串輸出。
 */


import java.util.Scanner;

public class Main {

    //傳入一個十六進制字符串參數,返回一個它的二進制字符串形式:
    public static String toBinary(String strHex)
    {

        StringBuffer strBin = new StringBuffer();
        for(int i=0;i<strHex.length();i++)
            switch (strHex.charAt(i))
            {
                case '0':strBin.append("0000");break;
                case '1':strBin.append("0001");break;
                case '2':strBin.append("0010");break;
                case '3':strBin.append("0011");break;
                case '4':strBin.append("0100");break;
                case '5':strBin.append("0101");break;
                case '6':strBin.append("0110");break;
                case '7':strBin.append("0111");break;
                case '8':strBin.append("1000");break;
                case '9':strBin.append("1001");break;
                case 'A':strBin.append("1010");break;
                case 'B':strBin.append("1011");break;
                case 'C':strBin.append("1100");break;
                case 'D':strBin.append("1101");break;
                case 'E':strBin.append("1110");break;
                case 'F':strBin.append("1111");break;
            }
        return strBin.toString();
    }

    //傳入一個二進制字符串參數,返回一個它的八進制字符串形式:
    public static String toOct(String strBin)
    {

        int key;                         //定義一個字段key用來判斷前三位是否爲000

        StringBuffer strOct = new StringBuffer();
        if(strBin.length()%3==1)
            strBin="00"+strBin;
        else if(strBin.length()%3==2)
            strBin="0"+strBin;

        //檢查二進制字符串前三位是否爲000
        if(strBin.substring(0,3).equals("000"))
            key=3;
        else
            key=0;
        for(int i=key;i<strBin.length()-2;i+=3)
        {
            switch (strBin.substring(i,i+3))
            {
                case "000":strOct.append("0");break;
                case "001":strOct.append("1");break;
                case "010":strOct.append("2");break;
                case "011":strOct.append("3");break;
                case "100":strOct.append("4");break;
                case "101":strOct.append("5");break;
                case "110":strOct.append("6");break;
                case "111":strOct.append("7");break;
            }
        }
        return strOct.toString();

    }

    public static void main(String[] args) {

        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        String [] strHex = new String[n];
        for (int i=0;i<strHex.length;i++)
            strHex[i]=sc.next();
        String strreu;                  //記錄轉換結果
        for(int i=0;i<strHex.length;i++)
        {
            strreu=toBinary(strHex[i]);
            strreu=toOct(strreu);
            System.out.println(strreu);
        }
    }
    
}

該方法的主要思路:將輸入的十六進制字符串通過逐個數位轉化爲4位二進制字符串,然後通過一個字符串緩衝的方式記錄,返回一整個十六進制字符串的二進制串形式,再將得到的二進制字符串按照相同的方法轉化爲八進制字符串輸出。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章