解题思路:本来以为是个简单题,写了个转化为10进制数直接Integer.toOctalString(),没想到直接溢出了,看了一下数据真就用了100000位,改用字符串做,大体思路就是16进制1位展4位2进制,再把2进制3位合1位8进制。
import java.util.Scanner;
public class Main {
static char[] H = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
static String[] HB = { "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010",
"1011", "1100", "1101", "1110", "1111" };
static String[] O = { "0", "1", "2", "3", "4", "5", "6", "7" };
static String str[];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] str = new String[n];
for (int i = 0; i < n; i++) {
str[i] = sc.next();
}
for (int i = 0; i < n; i++) {
String num = str[i];
num = HtoB(num);//十六进制转二进制
num = BtoO(num);//二进制转八进制
if(num.startsWith("0")) {//去除前导0
num=num.substring(1);
}
System.out.println(num);
}
}
static String HtoB(String str) {
StringBuffer ss = new StringBuffer() ;
for (int i = 0; i < str.length(); i++) {
ss.append(fhb(str.charAt(i)));
}
return ss.toString();
}
private static String BtoO(String str) {
int len = str.length();
//位数不够需补0
if (len % 3 == 1) {
str = "00" + str;
len += 2;
}
if (len % 3 == 2) {
str = "0" + str;
len += 1;
}
StringBuffer ss =new StringBuffer();
for (int i = 0; i < len; i += 3) {
ss .append(fbo(str.substring(i, i + 3))) ;
}
return ss.toString();
}
private static String fhb(char ch) {
//16进制对2进制的映射 f(16进制值)=2进制值
if (ch >= '0' && ch <= '9') {
return HB[ch - '0'];
} else {
return HB[ch - 'A' + 10];
}
}
private static String fbo(String str) {//2进制对8进制的映射
switch (str) {
case "000":
return O[0];
case "001":
return O[1];
case "010":
return O[2];
case "011":
return O[3];
case "100":
return O[4];
case "101":
return O[5];
case "110":
return O[6];
case "111":
return O[7];
}
return str;
}
}