问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
import java.util.Scanner;
public class Main {
//将十六进制转换为二进制(实现:将n个十六进制数保存为字符串数组,将每一个字符串转换为
//二进制的字符数组,并存放到结果数组中,全部转换结束后,返回结果数组,即字符串形式的二进制数组
//例如:{“12”,“346”}-->{"00001010","001101000110"}
public static String[] toBinary(String[] source){
String[] result = new String[source.length];
char[] temp = null;//用于存放字符串数组中某一字符串转化为字符数组
StringBuffer resultTmp = new StringBuffer("");//结果缓存
for(int i =0;i<source.length;i++){
temp = source[i].toCharArray();//将其中一个字符串转化为字符数组
//遍历字符数组,转换为二进制
for(int j=0;j<temp.length;j++){//每循环一次,在resultTmp上附加4位二进制
switch(temp[j]){
case '0':
resultTmp.append("0000");
break;
case '1':
resultTmp.append("0001");
break;
case '2':
resultTmp.append("0010");
break;
case '3':
resultTmp.append("0011");
break;
case '4':
resultTmp.append("0100");
break;
case '5':
resultTmp.append("0101");
break;
case '6':
resultTmp.append("0110");
break;
case '7':
resultTmp.append("0111");
break;
case '8':
resultTmp.append("1000");
break;
case '9':
resultTmp.append("1001");
break;
case 'A':
resultTmp.append("1010");
break;
case 'B':
resultTmp.append("1011");
break;
case 'C':
resultTmp.append("1100");
break;
case 'D':
resultTmp.append("1101");
break;
case 'E':
resultTmp.append("1110");
break;
case 'F':
resultTmp.append("1111");
break;
default:
break;
}
}
result[i]=resultTmp.toString();
resultTmp=null;
resultTmp=new StringBuffer();
}
return result;
}
//将二进制转换为八进制
//例如:{"00001010","001101000110"}-->{"12","346"}
public static String[] toOctal(String[] binary){
String[] result = new String[binary.length];
StringBuffer resultTmp = new StringBuffer("");
int oldIndex=0;//切割字符串时使用
//将每一个二进制字符串的长度都变成3的倍数
//如:{"00010010","001101000110"}-->{"000001010","001101000110"}
for(int i =0;i<binary.length;i++){
if(binary[i].length()%3==1){
binary[i]="00"+binary[i];
}else if(binary[i].length()%3==2){
binary[i]="0"+binary[i];
}
//字符串切割,每三个一组,转换成八进制,暂存到StringBuffer里面
//如:"000001010"-->"012"
for(int j=3;j<=binary[i].length();j+=3){
String tmp=binary[i].substring(oldIndex, j);
switch(tmp){
case "000":
resultTmp.append("0");
break;
case "001":
resultTmp.append("1");
break;
case "010":
resultTmp.append("2");
break;
case "011":
resultTmp.append("3");
break;
case "100":
resultTmp.append("4");
break;
case "101":
resultTmp.append("5");
break;
case "110":
resultTmp.append("6");
break;
case "111":
resultTmp.append("7");
break;
default:
break;
}
oldIndex=j;
}
oldIndex=0;//一个二进制字符串转换为八进制字符串后,将oldIndex置0,以便进行下一个二进制字符串的转换
//运行至此,其中一个二进制字符串已经转换为八进制字符串,下面将八进制字符串中高位多余的0去掉
//如:"012"-->"12"
if(resultTmp.charAt(0)=='0'){
result[i]=resultTmp.substring(1, resultTmp.length());
}else{
result[i]=resultTmp.toString();
}
resultTmp=null;//置空,以便下一个字符串的转换
resultTmp=new StringBuffer();
}
return result;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] num = new String[n];
for(int i = 0; i<num.length;i++){
num[i]=sc.next();
}
String[] tmp= Main.toBinary(num);
String[] result=Main.toOctal(tmp);
for(int i = 0; i<result.length;i++){
System.out.println(result[i]);
}
}
}