题目如下:
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
我的想法如下:
就如同提示所写,因为进制转换时4位2进制转换为16进制,3为二进制转换为8进制。因此我们可以利用这个特性,以二进制为中介,但是要注意的是,16进制转换为2进制之后,我们要注意要在2进制字符串前添加合适的‘0’使其成为3的倍数以便转换为8进制(在前面加是因为不会改变他的大小)。代码如下:
就如同提示所写,因为进制转换时4位2进制转换为16进制,3为二进制转换为8进制。因此我们可以利用这个特性,以二进制为中介,但是要注意的是,16进制转换为2进制之后,我们要注意要在2进制字符串前添加合适的‘0’使其成为3的倍数以便转换为8进制(在前面加是因为不会改变他的大小)。代码如下:
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int number = input.nextInt();
String[] a = new String[number];
int i = 0;
while (i<number) {
a[i] = input.next();
i++;
}
input.close();
String[] binary = toBinary(a);
String[] Octal = toOctal(binary);
for (int j = 0; j < Octal.length; j++) {
System.out.println(Octal[j]);
}
}
private static String[] toOctal(String[] binary) {
// TODO The Binary to the Octal
String[] result = new String[binary.length];
String tmp = null;
//给二进制字符串补数用
StringBuffer resultTmp = new StringBuffer();
//结果字符串用
int oldIndex = 0;
//切割字符串时用
int resultSub = 0;
//最后返回时去掉最开始的0用
for (int i = 0; i < result.length; i++) {
tmp = binary[i];
if (tmp.length() % 3 == 1) {
tmp = "00" + tmp;
}else if(tmp.length() % 3 == 2){
tmp = "0" + tmp;
}else;
for (int j = 3; j <= tmp.length(); j= j+3) {
//<=是因为substring方法截字符串是从第一个位置开始到最后一个参数位置(不含最后一个参数那位)
switch (tmp.substring(oldIndex, j)) {
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
for (int j = 0; j < resultTmp.length(); j++) {
resultSub = j;
if (resultTmp.charAt(j) != '0') {
break;
}
}
if (resultSub != 0) {
result[i] = resultTmp.substring(resultSub, resultTmp.length());
}else{
result[i] = resultTmp.toString();
}
resultTmp = null;
resultTmp = new StringBuffer();
//清零resultTmp,准备下次使用
}
return result;
}
private static String[] toBinary(String[] source) {
// TODO The Hex to the Binary
String[] result = new String[source.length];
char[] tmp = null;//将每一个String转化成字符数租
for (int i = 0; i < result.length; i++) {
tmp = source[i].toCharArray();
StringBuffer resultTmp = new StringBuffer("");
for (int j = 0; j < tmp.length; j++) {
switch (tmp[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();
}
return result;
}
}