import java.util.Scanner;
public class HexToDec {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String hex = sc.nextLine().trim().toUpperCase();
long dec = 0;
for (char c : hex.toCharArray()) {
int val = (c >= 'A') ? (c - 'A' + 10) : (c - '0');
dec = dec * 16 + val;
}
System.out.println(dec);
}
}
或直接使用庫函式:Long.parseLong(hex, 16)。
關鍵洞察:十六進制與八進制皆為 2 的冪次方基數(16=2⁴, 8=2³),可透過二進制作為中介,每 4 位十六進制對應 3 個八進制位(最小公倍數 12 位)。但最簡單且高效的方法是:
BigInteger(支援任意長度)。BigInteger.toString(8) 直接輸出八進制字串。import java.math.BigInteger;
import java.util.Scanner;
public class HexToOct {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
while (n-- > 0) {
String hex = sc.next().trim();
BigInteger bi = new BigInteger(hex, 16);
System.out.println(bi.toString(8));
}
}
}
若比賽限制不得用大整數庫,採用「查表法」分組轉換:
// 十六進制字元 → 4 位二進制字串
String[] hexToBin = {
"0000","0001","0010","0011","0100","0101","0110","0111",
"1000","1001","1010","1011","1100","1101","1110","1111"
};
// 3 位二進制 → 八進制字元
String[] binToOct = {"0","1","2","3","4","5","6","7"};
StringBuilder bin = new StringBuilder();
for (char c : hex.toCharArray()) {
bin.append(hexToBin[Character.digit(c, 16)]);
}
// 左側補 0 使長度為 3 的倍數
while (bin.length() % 3 != 0) bin.insert(0, '0');
StringBuilder oct = new StringBuilder();
for (int i = 0; i < bin.length(); i += 3) {
int idx = (bin.charAt(i)-'0')*4 + (bin.charAt(i+1)-'0')*2 + (bin.charAt(i+2)-'0');
oct.append(binToOct[idx]);
}
// 去除前導 0
String result = oct.toString().replaceFirst("^0+", "");
System.out.println(result.isEmpty() ? "0" : result);
Long.parseLong(s, 16) + Long.toOctalString()。