问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
解法: 可以先将十六进制转换为二进制,再有二进制转为八进制。24=16,一个十六进制数可以转成4个二进制数。23=8,3个二进制数可以转成1个八进制数,使用取三合一,不足最高位(最左边)补0,缺几个补几个0。字符串拼接可以使用StringBuilder和StringBuffer,不然可能会出现时间超时。
import java.util.Scanner;
// 基础练习 十六进制转八进制
public class Main {
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();
}
String str2[] = new String[n];
for (int i = 0; i < n; i++) {
System.out.println(binToOct(hexToBin(str[i])));
}
}
// 二进制转八进制
public static String binToOct(String binStr) {
int len = binStr.length();
// 取三合一
if (len % 3 == 1) {
binStr = "00" + binStr;
} else if (len % 3 == 2) {
binStr = "0" + binStr;
}
char char_arr[] = binStr.toCharArray();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < char_arr.length; i += 3) {
// 二进制计算成八进制
int sum = 4 * (char_arr[i] - '0') + 2 * (char_arr[i+1] - '0') + (char_arr[i+2] - '0');
// 前导不为0
if (sum == 0 && i == 0) {
} else {
sb.append(sum);
}
}
return sb.toString();
}
// 十六进制转二进制
public static String hexToBin(String s) {
StringBuilder sb = new StringBuilder();
char ch[] = s.toCharArray();
for (int i = 0; i < ch.length; i++) {
switch (ch[i]) {
case '0':
sb.append("0000");
break;
case '1':
sb.append("0001");
break;
case '2':
sb.append("0010");
break;
case '3':
sb.append("0011");
break;
case '4':
sb.append("0100");
break;
case '5':
sb.append("0101");
break;
case '6':
sb.append("0110");
break;
case '7':
sb.append("0111");
break;
case '8':
sb.append("1000");
break;
case '9':
sb.append("1001");
break;
case 'A':
sb.append("1010");
break;
case 'B':
sb.append("1011");
break;
case 'C':
sb.append("1100");
break;
case 'D':
sb.append("1101");
break;
case 'E':
sb.append("1110");
break;
case 'F':
sb.append("1111");
break;
default:
break;
}
}
return sb.toString();
}
}