import java.util.Scanner;
public class Main {
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
String[] st=new String[n];
for(int i=0;i<n;i++)
{
st[i] =sc.next();
}
sc.close();
for(int i=0;i<n;i++)
{
String str1=ttos(st[i]);
int len_str1=str1.length();
if(len_str1%3==1)str1="00"+str1;
else if(len_str1%3==2)str1="0"+str1;
ttoe(str1);
System.out.println();
}
}
public static String ttos(String str)
{
int len_str=str.length();
StringBuilder str2=new StringBuilder();
for(int i=0;i<len_str;++i)
{
switch(str.charAt(i))
{
case '0':str2.append("0000");break;
case '1':str2.append("0001");break;
case '2':str2.append("0010");break;
case '3':str2.append("0011");break;
case '4':str2.append("0100");break;
case '5':str2.append("0101");break;
case '6':str2.append("0110");break;
case '7':str2.append("0111");break;
case '8':str2.append("1000");break;
case '9':str2.append("1001");break;
case 'A':str2.append("1010");break;
case 'B':str2.append("1011");break;
case 'C':str2.append("1100");break;
case 'D':str2.append("1101");break;
case 'E':str2.append("1110");break;
case 'F':str2.append("1111");break;
default:break;
}
} return str2.toString();
}
public static void ttoe(String str2)
{
int len=str2.length();
int a;
a=(str2.charAt(0)-'0')*4+(str2.charAt(1)-'0')*2+(str2.charAt(2)-'0');
if(a!=0)System.out.print(a);
for(int i=3;i<=len-2;i+=3)
{
a=(str2.charAt(i)-'0')*4+(str2.charAt(i+1)-'0')*2+(str2.charAt(i+2)-'0');
System.out.print(a);
}
}
}
思路分析:
题目要求输入n个十六进制的数进行转换,因N不超过10,可以用字符串数组进行存储,然后依次进行转换。
函数:
1. public static Stringttos(String str) 传递保存在字符串数组的的字符串,目的将16进制,转换成二进制字符串(三位二进制数对应一个8进制数)。函数返回转换后的二进制字符串。使用StringBuilder 效率更高效
2. 接着需要将二进制字符串转换成八进制,在此之前需要进行小小的调整
需要将字符串长度调整为3的倍数,方便转换,考虑到从尾部开始计算,需要借助数组或其他的集合进行存储,无法满足题目的运行要求;
3 于是考虑从头部做文章,记二进制字符串长度为len;当len%3=0时刚好方便转换,
当len%3=1时,试想最后剩余第一位数str.chatAt(0)单独转换,考虑在前面补上“00”后,
可以全部三位一起转换,且不影响最终结果,当len%3=2时同理补上“0”;
4 public static void ttoe(String str2)将处理过的二进制字符转转换成八进制,并且进行边转换边输出,提高效率。