问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
以往我们的做法都是逐位进行累乘和累加,但是题目中的信息告诉我们长度很大,longlong一定装不下,并且用单纯的数学类型就会超时(bignums类型)所以我们打算直接从字符串上入手。
我们可以发现,将十六进制的每一位单独用二进制来表示,补齐二进制码使得长度为3的倍数后,没3个二进制码代表的就是八进制对于的二进制码。
注意,在提取成二进制的时候不用在意0000的出现,但是在转化的时候要考虑开头是000,这种情况要跳过。
import java.io.*;
public class Main {
public static void main(String [] args) throws IOException {
BufferedReader line=new BufferedReader(new InputStreamReader(System.in));
String in="";
int count=0;
in=line.readLine();
count=Integer.valueOf(in);
String []strs=new String[count];
for(int i=0;i<count;i++) {
in=line.readLine();
strs[i]=in;
}
for(int i=0;i<count;i++) {
System.out.println(fun1(strs[i]));
}
}
private static String fun1(String str1) {
int length=str1.length();
StringBuffer str=new StringBuffer();
if(length*4%3==1) { //前面的0不够要用0补齐,使二进制长度成3的倍数
str.append("00");
}
else if(length*4%3==2) {
str.append("0");
}
char[] c=str1.toCharArray(); //换成数组速度更快
for(int i=0;i<c.length;i++) {
switch (c[i]) {
case'0':str.append("0000");break;
case'1':str.append("0001");break;
case'2':str.append("0010");break;
case'3':str.append("0011");break;
case'4':str.append("0100");break;
case'5':str.append("0101");break;
case'6':str.append("0110");break;
case'7':str.append("0111");break;
case'8':str.append("1000");break;
case'9':str.append("1001");break;
case'A':str.append("1010");break;
case'B':str.append("1011");break;
case'C':str.append("1100");break;
case'D':str.append("1101");break;
case'E':str.append("1110");break;
case'F':str.append("1111");break;
}
}
StringBuffer ans=new StringBuffer();
for(int i=0;i<str.length()/3;i++) {
String t=str.substring(i*3,i*3+3);
if(i!=0||!t.equals("000")) {
switch(t) {
case"000":ans.append("0");break; //跳过000
case"001":ans.append("1");break;
case"010":ans.append("2");break;
case"011":ans.append("3");break;
case"100":ans.append("4");break;
case"101":ans.append("5");break;
case"110":ans.append("6");break;
case"111":ans.append("7");break;
}
}
}
return ans.toString();
}
}