題目:
問題描述
給定n個十六進制正整數,輸出它們對應的八進制數。
輸入格式
輸入的第一行為一個正整數n (1<=n<=10)。
接下來n行,每行一個由09、大寫字母AF組成的字元串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。
輸出格式
輸出n行,每行為輸入對應的八進制正整數。
【注意】
輸入的十六進制數不會有前導0,比如012A。
輸出的八進制數也不能有前導0。
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
【提示】
先将十六進制數轉換成某進制數,再由某進制數轉換成八進制。
思路:
剛開始寫,想都不想直接java 進制api,後面發現這種進制轉換api在遇到超級長的數字時就跑不動了,因為題目說低于十萬位,顯然要求能處理大數字。大數字java api處理不了,可以用字元串來代替。提示也說了,先将十六進制轉換為某進制,其實就是二進制數,一個十六進制數換4個二進制數,接着将得到的二進制數轉成8進制,3個二進制數換1個八進制數,是以先判斷二進制數長度是否為3的倍數,若剛合适,則防止數字前導是三個0,若數字前三位為0則删除;若多出一個數字則判斷這個數字是否為0,是0就删除,若不是0,則額外增加2個0;若多出2個,則判斷頭兩個是否為00,若為00,則删除,若不是則在開頭加一個0;最後用
Integer.parseInt(xxx,2)
方法将3個3個的二進制數換成十進制,因為換成十進制最後相接就是我們要得到的8進制數
代碼:
import java.util.Scanner;
public class Main {
//用Integer類自帶的二進制,八進制,十六進制
//Integer.valueOf(a, b)這個的用法和上面那個parseInt一樣
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);//輸入行數
int n=sc.nextInt();
String[]s=new String[11];//10行
for(int i=0;i<n;i++) {//輸入每行字元串
String ss=sc.next();
s[i]=ss;
}
for(int j=0;j<n;j++) {//
StringBuilder two=new StringBuilder();//2進制
for(int k=0;k<s[j].length();k++) {
char num=s[j].charAt(k);
switch(num) {
case '0':two.append("0000");break;
case '1':two.append("0001");break;
case '2':two.append("0010");break;
case '3':two.append("0011");break;
case '4':two.append("0100");break;
case '5':two.append("0101");break;
case '6':two.append("0110");break;
case '7':two.append("0111");break;
case '8':two.append("1000");break;
case '9':two.append("1001");break;
case 'A':two.append("1010");break;
case 'B':two.append("1011");break;
case 'C':two.append("1100");break;
case 'D':two.append("1101");break;
case 'E':two.append("1110");break;
case 'F':two.append("1111");break;
}
}
eight(two);
}
}
public static void eight(StringBuilder two) {
StringBuilder eight=new StringBuilder();//2進制
int twolen=two.length();
if(twolen%3==0) {//剛好夠配置設定,則判斷最前面有無000
if(two.substring(0, 3).equals("000")) {
two.delete(0, 3);
}
}
else if(twolen%3==1) {//多出一個
if(two.substring(0, 1).equals("0")) {
two.delete(0, 1);
}
else {
two=two.insert(0, "00");
}
}
else if(twolen%3==2) {//多出兩個
if(two.substring(0, 2).equals("00")) {
two.delete(0, 2);
}
else {
two=two.insert(0, "0");
}
}
int two_newlen=two.length();
for(int i=0;i<two_newlen/3;i++) {
int N=Integer.parseInt(two.substring(i*3,i*3+3),2);//2進制轉化成10進制
eight.append(N);
}
System.out.println(eight);
}
}