问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
解法
import java.util.Scanner;
public class Trans {
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
String[] array=new String[n];
//16进制转换二进制
StringBuffer[] result=new StringBuffer[n];
for(int u=0;u<n;u++){
array[u]=scanner.next();
int length=array[u].length();
int i=length;
StringBuffer sb=new StringBuffer();
while(i!=0){
switch (array[u].charAt(length-i)){
case '0':
sb.append("0000");
break;
case '1':
sb.append("0001");
break;
case '2':
sb.append("0010");
break;
case '3':
sb.append("0011");
break;
case '4':
sb.append("0100");
break;
case '5':
sb.append("0101");
break;
case '6':
sb.append("0110");
break;
case '7':
sb.append("0111");
break;
case '8':
sb.append("1000");
break;
case '9':
sb.append("1001");
break;
case 'A':
sb.append("1010");
break;
case'B':
sb.append("1011");
break;
case 'C':
sb.append("1100");
break;
case 'D':
sb.append("1101");
break;
case 'E':
sb.append("1110");
break;
case 'F':
sb.append("1111");
break;
}
--i;
}
result[u]=sb;
}
//二进制转八进制
for(int k=0;k<n;k++){
String b=result[k].toString();
if(result[k].length()%3==1){
b="00"+result[k];
}
else if(result[k].length()%3==2){
b="0"+result[k];
}
//让输出结果的开头不会为零
int length=b.length();
//因为'0'的acci码是48,而不是从0开始,所以要char与整形进行运算要得到正确结果都要-‘0’,保证结果正确;
int a=(b.charAt(0)-'0')*4+(b.charAt(1)-'0')*2+(b.charAt(2)-'0');
if(a!=0)
System.out.print(a);
for(int e=3;e<length;e++){
int s=(b.charAt(e)-'0')*4+(b.charAt(e+1)-'0')*2+(b.charAt(e+2)-'0');
e+=2;
System.out.print(s);
}
System.out.println();
}
}
}
注意
类名必须是Main,以上代码并没有改,而且这题做的话最好用StringBuffer或StringBuilder来操作字符串,不然单纯用String效率会很低,提交到系统的话可能会操作超时