首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 進制轉換:十六進制轉八進制與十進制完整實作

     編輯:程式設計疑難解答

題目一:十六進制轉十進制(單值,≤ 8 位)

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)。

題目二:十六進制轉八進制(多筆,長度 ≤ 100,000)

關鍵洞察:十六進制與八進制皆為 2 的冪次方基數(16=2⁴, 8=2³),可透過二進制作為中介,每 4 位十六進制對應 3 個八進制位(最小公倍數 12 位)。但最簡單且高效的方法是:

  1. 十六進制字串 → BigInteger(支援任意長度)。
  2. 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));
        }
    }
}

手動實現(不使用 BigInteger)

若比賽限制不得用大整數庫,採用「查表法」分組轉換:


// 十六進制字元 → 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()。
  • 長字串/競賽:BigInteger 一行解決,或手寫「十六進制→二進制→八進制」分組查表法,時間複雜度 O(N)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved