第一种方法:使用java自带的 Integer.parseInt(String s, int radix) 和 Integer.toString(int n, int radix)方法直接进行进制之间的转换。
第二种方法:先将十六进制转换为二进制,再将转化的二进制数转换为八进制
思路:首先,分别建立十六进制、八进制和二进制对应的表(字符串数组);其次,十六进制转二进制直接依次遍历输入的字符在十六进制表中的索引,然后根据索引找出对应的二进制数;然后将最终的二进制字符串的长度变为3的倍数(此处这样做的原因是八进制表只有8个数,其中最大的数7对应的二进制数为0111,所以必须每次取3位来进行查找; 否则在遍历的过程中会出现八进制数组越界的情况。)依次将二进制字符串中的 【‘0’+3位】对应到八进制表中的索引对应的值。
具体代码如下:
package introductory;
import java.util.Arrays;
import java.util.Scanner;
public class test02 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
// String[] s = new String[n];
// String[] ss = new String[n];
// for(int i=0; i<n; i++){
// s[i] = sc.next();
// int b = Integer.parseInt(s[i],16);
// ss[i] = Integer.toString(b,8);
// }
// for(String s1: ss){
// System.out.println(s1);
// }
//接收输入十六进制的字符串
String[] nums = new String[n];
for(int i=0; i<n; i++){
nums[i] = sc.next();
}
sc.close();
String[] ss = new String[n];
//十六进制表
String[] HEXs = {
"0","1","2","3","4","5","6","7",
"8","9","A","B","C","D","E","F"
};
//二进制表
String[] BINs = {
"0000","0001","0010","0011","0100","0101","0110","0111",
"1000","1001","1010","1011","1100","1101","1110","1111"
};
//八进制表
String[] OCTs = {
"0","1","2","3","4","5","6","7"
};
for(int m=0; m<n; m++){
String hex = nums[m];
StringBuffer sbBin = new StringBuffer();
StringBuffer sbOct = new StringBuffer();
//十六进制转二进制
for(int i=0; i<hex.length(); i++){
String c = Character.toString(hex.charAt(i));
//查询当前字符在十六进制表中的索引值
int index = Arrays.binarySearch(HEXs,c);
sbBin.append(BINs[index]);
}
while(sbBin.length() % 3 != 0){
sbBin.insert(0,"0");
}
int octLen = sbBin.length()/3;
/*
此处这样做的原因是八进制表只有8个数,其中最大的数7对应的二进制数为0111,所以必须每次取3位来进行查找;
否则在遍历的过程中会出现八进制数组越界的情况。
*/
for(int i=0; i<octLen; i++){
String span = sbBin.substring(3*i,3*i+3);
int index = Arrays.binarySearch(BINs,'0'+span);
sbOct.append(OCTs[index]);
}
while(sbOct.charAt(0) == '0'){
sbOct.delete(0,1);
}
ss[m] = sbOct.toString();
}
for(String s: ss){
System.out.println(s);
}
}
}