问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
这个题如果直接调用Integer.toString()是错误的,因为十六进制数的长度达到1e6,远远超过了int和long的范围;
那么就需要先将16进制转换成2进制,再将2进制转换成8进制来做;
值得注意的是:这里的字符串类型如果使用String类会TLE;
应当使用StringBuilder类型原因在此处介绍;
import java.util.*;
import java.text.DecimalFormat;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.Math;
import java.lang.reflect.Array;
import java.math.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
for(int i=0;i<t;++i) {
String s=sc.next();
//System.out.println(s);
StringBuilder ans=new StringBuilder();
for(int i1=0;i1<s.length();++i1) {
String temp=Integer.toBinaryString(Integer.parseInt(""+s.charAt(i1),16));
for(int i11=1;i11<=4-temp.length();++i11) {
ans.append("0");
}
ans.append(temp);
}
StringBuilder bi=new StringBuilder();
if(ans.length()%3==1)bi.append("00");
else if(ans.length()%3==2) bi.append("0");
bi.append(ans);
StringBuilder oc=new StringBuilder();
for(int i1=0;i1<bi.length();i1+=3) {
String temp=""+bi.charAt(i1)+bi.charAt(i1+1)+bi.charAt(i1+2);
String hh=Integer.toOctalString(Integer.parseInt(temp,2));
oc.append(hh);
}
String tt=oc.substring(0);
for(int i1=0;i1<oc.length();++i1)
if(oc.charAt(i1)!='0') {
tt=oc.substring(i1);
break;
}
System.out.println(tt);
}
sc.close();
}
}