問題描述
給定n個十六進制正整數,輸出它們對應的八進制數。
輸入格式
輸入的第一行為一個正整數n (1<=n<=10)。
接下來n行,每行一個由0~9、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。
輸出格式
輸出n行,每行為輸入對應的八進制正整數。
【注意】
輸入的十六進制數不會有前導0,比如012A。
輸出的八進制數也不能有前導0。
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
拿到題目覺着還挺簡單,直接用了String和Integer的幾個函數,樣例輸出沒問題。提交上去發現提示運行錯誤。
下載下來測試數據,才知道輸入進去了一個多么變態的數:

1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public class Main { 5 6 public static void main(String[] args) { 7 Scanner in=new Scanner(System.in); 8 int n=in.nextInt(); 9 String [] result=new String[11]; 10 for(int i=0;i<n;i++){ 11 String h=in.next(); 12 String b=Integer.toBinaryString(Integer.valueOf(h, 16)); 13 String o=Integer.toOctalString(Integer.valueOf(b, 2)); 14 result[i]=o; 15 } 16 for(int i=0;i<n;i++){ 17 System.out.println(result[i]); 18 } 19 } 20 } 21
測試數據:
在第一次的代碼上做了改動:
①首先將每一位十六進制數轉換為四位二進制數(一定要轉為4位,使用前導0),保存為字符串;
②將字符串長度化為3的倍數,以便向八進制轉化;
③每三位轉化為八進制,去掉前導零;
代碼如下,可通過測試:
1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public class Poj { 5 6 public static void main(String[] args) { 7 Scanner in=new Scanner(System.in); 8 int n=in.nextInt(); 9 String [] result=new String[11];//保存最后輸出的結果 10 /*十六進制轉化為二進制*/ 11 for(int i=0;i<n;i++){ 12 String h=in.next(); 13 StringBuilder tempB=new StringBuilder(); 14 for(int m=0;m<h.length();m++){ 15 char numH=h.charAt(m); 16 String b=Integer.toBinaryString(Integer.valueOf(String.valueOf(numH), 16)); 17 18 for(int k=b.length();k<4;k++){ 19 b='0'+b; 20 } 21 22 tempB.append(b); 23 } 24 25 /*二進制轉化為八進制*/ 26 StringBuilder tempO=new StringBuilder();//長度變為3的倍數,需要補的前導0的個數 27 int addZero=3-tempB.length()%3; 28 for(int p=0;p<addZero;p++){ 29 tempB=new StringBuilder("0").append(tempB); 30 } 31 for(int m=0;m<tempB.length();m+=3){ 32 //把字符串長度轉換為三的倍數添加前導0 33 String numB=tempB.substring(m, m+3); 34 String o=Integer.toOctalString(Integer.valueOf(String.valueOf(numB), 2)); 35 tempO.append(o); 36 } 37 result[i]=tempO.toString().replaceAll("^(0+)", "");//用正則表達式去掉前導零 38 } 39 for(int i=0;i<n;i++){ 40 System.out.println(result[i]); 41 } 42 } 43 }