問題描述
給定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位二進制字符串,然後通過一個字符串緩衝的方式記錄,返回一整個十六進制字符串的二進制串形式,再將得到的二進制字符串按照相同的方法轉化爲八進制字符串輸出。