资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
解题思路
1.解决超时问题:预先将16进制对应的二进制字符串存在字符串数组中,通过下标对应转换。
2.先将16进制转为2进制,再转为8进制时会存在不是3的倍数,解决办法就是在字符串前面添“0”
3.八进制数不能存在先导0。
为什么会存在先导0?
当16进制转2进制时,可能就会存在开头有0的情况,如1(16)——>0001(2),此时若转换为8进制,8进制的开头就极有可能为0。
解决:输出前判断先导是否为0,为0就删除0再输出
代码
import java.util.*;
class Main{
//为了解决超时问题,可以先将要转换的数组存储下来,通过数组下标直接转换
static String []str= {"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
public static void main(String args[]) {
Scanner cin=new Scanner(System.in);
int n=cin.nextInt();
StringBuffer num=new StringBuffer();
String []nums=new String[n];
for(int i=0;i<n;i++) {
nums[i]=cin.next();
}
for(int i=0;i<n;i++) {
num=transform(nums[i]);
if(num.substring(0,1).equalsIgnoreCase("0")) {//为啥会有先导0:16进制转2进制时会有0,当不为3的整数时在添0,所以会有先导0
String result=num.substring(1);
System.out.println(result);
}
else System.out.println(num);
}
cin.close();
}
static StringBuffer transform(String num) {
int start=0;
int end=1;
String s="";//截取字符串
StringBuffer str=new StringBuffer();//接收转换的二进制字符
while(end<=num.length()) {
s=num.substring(start, end);
String s1=transform1(s);
str.append(s1);
start++;
end++;
}//将16进制转换为2进制
//System.out.println(str.length());
String result="";
if(str.length()%3==1) {
result="00"+str;
}
else if(str.length()%3==2) {
result="0"+str;
}
else result=str.toString();
//System.out.println(result);
StringBuffer Str=new StringBuffer();
start=0;
end=3;
for(int j=0;j<result.length()/3;j++) {
s=result.substring(start,end);
start+=3;
end+=3;
String s2=transform2(s);
Str.append(s2);
}
return Str;
}
static String transform1(String s) {
String result="";
switch(s) {
case "0":result=str[0]; break;
case "1":result=str[1]; break;
case "2":result=str[2]; break;
case "3":result=str[3]; break;
case "4":result=str[4]; break;
case "5":result=str[5]; break;
case "6":result=str[6]; break;
case "7":result=str[7]; break;
case "8":result=str[8]; break;
case "9":result=str[9]; break;
case "A":result=str[10]; break;
case "B":result=str[11]; break;
case "C":result=str[12]; break;
case "D":result=str[13]; break;
case "E":result=str[14]; break;
case "F":result=str[15]; break;
}
return result;
}
static String transform2(String s) {
String result="";
switch(s) {
case "000":result="0";break;
case "001":result="1";break;
case "010":result="2";break;
case "011":result="3";break;
case "100":result="4";break;
case "101":result="5";break;
case "110":result="6";break;
case "111":result="7";break;
}
return result;
}
}