給定一個整數(範圍 1~3999),將其轉換為羅馬數字表示。
| 符號 | 值 |
|---|---|
| I | 1 |
| V | 5 |
| X | 10 |
| L | 50 |
| C | 100 |
| D | 500 |
| M | 1000 |
組合規則:
將輸入數字按個、十、百、千四位拆解,每位獨立映射對應的羅馬符號組合,最後拼接。
// 每位對應 [1符號, 5符號],千位無5符號
char[][] roman = {
{'I', 'V'}, // 個位
{'X', 'L'}, // 十位
{'C', 'D'}, // 百位
{'M', 0 } // 千位
};
對當前位數字 digit (0-9):
digit == 4:one + five(如 IV、XL、CD)digit == 9:one + next_one(如 IX、XC、CM)digit >= 5:five + (digit-5) * one(如 VIII、LXXX)digit < 4:digit * one(如 III、XXX)public String intToRoman(int num) {
if (num < 1 || num > 3999) throw new IllegalArgumentException("Out of range");
char[][] roman = {{'I','V'}, {'X','L'}, {'C','D'}, {'M', 0}};
StringBuilder sb = new StringBuilder();
// 確定最高位
int level = 0;
for (int n = num; n > 0; n /= 10) level++;
while (--level >= 0) {
int digit = (num / (int)Math.pow(10, level)) % 10;
char one = roman[level][0];
char five = roman[level][1];
if (digit == 4) {
sb.append(one).append(five);
} else if (digit == 9) {
sb.append(one).append(roman[level+1][0]); // level+1 安全:千位digit最大3
} else {
if (digit >= 5) {
sb.append(five);
digit -= 5;
}
for (int i = 0; i < digit; i++) sb.append(one);
}
}
return sb.toString();
}
| 輸入 | 輸出 | 說明 |
|---|---|---|
| 3 | III | 基礎加法 |
| 4 | IV | 減法規則 |
| 9 | IX | 跨位減法 |
| 58 | LVIII | L + V + III |
| 1994 | MCMXCIV | M + CM + XC + IV |
| 3999 | MMMCMXCIX | 最大值 |
int[] values = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
String[] symbols = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
for (int i = 0; i < values.length; i++) {
while (num >= values[i]) {
num -= values[i];
sb.append(symbols[i]);
}
}
優點:代碼極簡,無需位運算。缺點:需維護有序表,直觀度稍低。
roman[4] 越界 —— 實際上千位最大為 3,不會觸發 9,但代碼需邏輯自證或加邊界判斷。String 拼接導致 O(n²) 性能,應用 StringBuilder。