问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int n = input.nextInt();
String[] str = new String[n];
for(int i = 0; i < n ; i++) {
str[i] = input.next();
}
// 转换
for(int i = 0; i < n ; i++) {
StringBuilder bs = new StringBuilder();
StringBuilder os = new StringBuilder();
for(int j = 0; j < str[i].length(); j++) {
char c = str[i].charAt(j);
String s = Integer.toBinaryString(Integer.valueOf(String.valueOf(c),16));
// 十六进制转二进制,Java自带进制转换方法无法转换大数据
for(int k = s.length(); k < 4 & j != 0; k++) {
s = "0" + s; // 将二进制数位补足,防止出现前导零
}
bs.append(s);
}
if(bs.length() % 3 == 1) bs = new StringBuilder("00").append(bs);
else if(bs.length() % 3 == 2) bs = new StringBuilder("0").append(bs);// 将二进制位数增加为3的倍数
for(int j = 0; j < bs.length(); j = j + 3) {
String sub = bs.substring(j,j+3);
// System.out.println(sub);
os.append(Integer.toOctalString(Integer.valueOf(sub,2)));
}
System.out.println(os);
}
input.close();
}
}