1. 程式人生 > >藍橋杯之16進制轉8進制

藍橋杯之16進制轉8進制

系統 建立 轉換 pan jdk ram string class col

題目:

問題描述
  給定n個十六進制正整數,輸出它們對應的八進制數。

輸入格式
  輸入的第一行為一個正整數n (1<=n<=10)。
  接下來n行,每行一個由0~9、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。

輸出格式
  輸出n行,每行為輸入對應的八進制正整數。

  【註意
  輸入的十六進制數不會有前導0,比如012A。
  輸出的八進制數也不能有前導0。

樣例輸入
  2
  39
  123ABC

樣例輸出
  71
  4435274

  提示
  先將十六進制數轉換成某進制數,再由某進制數轉換成八進制。

因為在藍橋杯官網下的練習系統中使用的jdk版本為1.6,在1.6中switch方法貌似不支持判斷字符串,所以就改成了if...elseif...的處理方式。

import java.util.Scanner;

public class Main {

/**
* @param args
*/
public static void main(String[] args) {


Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] strs = new String[n];
for(int i=0;i<n;i++){
strs[i] = sc.next();
}
sc.close();


for(int j=0;j<n;j++){
String binary = toBinary(strs[j]);
if(binary.length()%3==2) binary = "0"+binary;
if(binary.length()%3==1) binary = "00"+binary;

System.out.println(toOctonary(binary));
}

}

public static String toOctonary(String s){
int z;
if(s.substring(0,3).equals("000"))
z = 3;
else {
z = 0;
}
int l = s.length();
StringBuffer sBuffer = new StringBuffer();
for(int i = z; i < l-2; i+=3){
if(s.substring(i,i+3).equals("000"))
sBuffer.append("0");
else if (s.substring(i,i+3).equals("001"))
sBuffer.append("1");
else if (s.substring(i,i+3).equals("010"))
sBuffer.append("2");
else if (s.substring(i,i+3).equals("011"))
sBuffer.append("3");
else if (s.substring(i,i+3).equals("100"))
sBuffer.append("4");
else if (s.substring(i,i+3).equals("101"))
sBuffer.append("5");
else if (s.substring(i,i+3).equals("110"))
sBuffer.append("6");
else if (s.substring(i,i+3).equals("111"))
sBuffer.append("7");
}
return sBuffer.toString();
}

public static String toBinary(String str){
StringBuffer sBuffer = new StringBuffer();
int l = str.length();
for(int i = 0; i < l; i++){
switch (str.charAt(i)) {
case ‘0‘:
sBuffer.append("0000");
break;
case ‘1‘:
sBuffer.append("0001");
break;
case ‘2‘:
sBuffer.append("0010");
break;
case ‘3‘:
sBuffer.append("0011");
break;
case ‘4‘:
sBuffer.append("0100");
break;
case ‘5‘:
sBuffer.append("0101");
break;
case ‘6‘:
sBuffer.append("0110");
break;
case ‘7‘:
sBuffer.append("0111");
break;
case ‘8‘:
sBuffer.append("1000");
break;
case ‘9‘:
sBuffer.append("1001");
break;
case ‘A‘:
sBuffer.append("1010");
break;
case ‘B‘:
sBuffer.append("1011");
break;
case ‘C‘:
sBuffer.append("1100");
break;
case ‘D‘:
sBuffer.append("1101");
break;
case ‘E‘:
sBuffer.append("1110");
break;
case ‘F‘:
sBuffer.append("1111");
break;
default:
break;
}
}


return sBuffer.toString();
}
}

這是參考了一位博客兄的文章在自己實踐的,思路是基本參照他的。

1.利用循環讀取控制臺的輸入

2.在16進制轉2進制過程中,建立一個StringBuffer對象,利用了for循環+chatAt()方法一個一個地讀取16進制數,讀取到的字符利用switch方法去識別是0或1或2....到F,然後就利用StringBuffer對象的append()方法對應地追加"0000"或"0001"等等,在返回這個StringBuffer.toString()的字符串。

3.然後到了2進制轉換為8進制。因為在上面中轉換過來的二進制位數不一定是3的倍數(因為一個8進制數對應3位二進制數),所以對轉換過來的2進制數進行補位數。在利用和轉換16進制數差不多的方法前,需要註意的是題目要求中不允許輸出的8進制數是0開頭的,所以在這對二進制數進行了一次開頭是3個000的就從3開始判斷(題目說明輸入的16進制不會是0開頭的,所以只要做一次判斷就可以了)。

4.通過以上的轉換,就可以輸出了,100分通過。

藍橋杯之16進制轉8進制