问题描述
给定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
来源:https://www.cnblogs.com/LieYanAnYing/p/12178729.html