十六进制转八进制_蓝桥杯
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
代码
/** *首先十六进制To二进制,然后二进制To八进制 *利用switch进行转换,比如A转换为1010,利用字符串进行拼接,最后三个三个提取出来转化为八进制 **/ package jiChuLianXi; import java.util.Scanner; public class HexadecimaToOctal { static String hTo(String s){ //16T2 StringBuilder s1=new StringBuilder(), s3=new StringBuilder(); for(int i=0; i<s.length(); i++){ switch(s.charAt(i)){ case '0':s1.append("0000");break; case '1':s1.append("0001");break; case '2':s1.append("0010");break; case '3':s1.append("0011");break; case '4':s1.append("0100");break; case '5':s1.append("0101");break; case '6':s1.append("0110");break; case '7':s1.append("0111");break; case '8':s1.append("1000");break; case '9':s1.append("1001");break; case 'A':s1.append("1010");break; case 'B':s1.append("1011");break; case 'C':s1.append("1100");break; case 'D':s1.append("1101");break; case 'E':s1.append("1110");break; case 'F':s1.append("1111");break; default:break; } } //补位使为3的倍数,因为一个八进制数用三位二进制数表示 if(s1.length()%3==1) s1.insert(0,"00"); else if(s1.length()%3==2) s1.insert(0,"0"); //2T8 int a=(s1.charAt(0)-'0')*4+(s1.charAt(1)-'0')*2+(s1.charAt(2)-'0'); //为了不出现前导0 if(a!=0) s3.append(a+""); //若a!=0就直接输出了 for(int i=3;i<=s1.length()-2;i+=3) { a=(s1.charAt(i)-'0')*4+(s1.charAt(i+1)-'0')*2+(s1.charAt(i+2)-'0'); s3.append(a+""); } return s3.toString(); } public static void main(String argv[]){ Scanner in = new Scanner(System.in); int n = in.nextInt(); String[] str = new String[n]; for(int i=0; i<n; i++){ str[i] = in.next(); } in.close(); for(int i=0; i<n; i++) System.out.println(hTo(str[i])); } }
注意!注意!注意!在循环里使用“+”进行字符串连接是魔鬼!它生生将程序的运行时间和运行内存提高了四五倍。。。在进行断断续续连接成一个字符串时,应尽可能使用StringBuilder.append(String str);关于两者的区别,请见:https://blog.csdn.net/m0_37589327/article/details/78605268