天天看點

【JAVA藍橋杯基礎練習】十六進制轉八進制

題目:

問題描述

  給定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);
          }
}