藍橋杯 十六進制轉八進制(超大測試數據,java實現)


問題描述
  給定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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM