羅馬數(shù)字包含以下七種字符:I,V公给,X借帘,L,C淌铐,D和M肺然。
字符數(shù)值
I? ? ? ? ? ? 1
V? ? ? ? ? ? 5
X? ? ? ? ? ? 10
L? ? ? ? ? ? 50
C? ? ? ? ? ? 100
D? ? ? ? ? ? 500
M? ? ? ? ? ? 1000
例如, 羅馬數(shù)字 2 寫做II腿准,即為兩個并列的 1际起。12 寫做XII,即為X+II吐葱。 27 寫做XXVII, 即為XX+V+II街望。
通常情況下,羅馬數(shù)字中小的數(shù)字在大的數(shù)字的右邊弟跑。但也存在特例灾前,例如 4 不寫做IIII,而是IV窖认。數(shù)字 1 在數(shù)字 5 的左邊豫柬,所表示的數(shù)等于大數(shù) 5 減小數(shù) 1 得到的數(shù)值 4 告希。同樣地,數(shù)字 9 表示為IX烧给。這個特殊的規(guī)則只適用于以下六種情況:
I可以放在V(5) 和X(10) 的左邊燕偶,來表示 4 和 9。
X可以放在L(50) 和C(100) 的左邊础嫡,來表示 40 和?90指么。
C可以放在D(500) 和M(1000) 的左邊,來表示?400 和?900榴鼎。
給你一個整數(shù)伯诬,將其轉(zhuǎn)為羅馬數(shù)字。
示例?1:
輸入:num = 3輸出:"III"
示例?2:
輸入:num = 4輸出:"IV"
示例?3:
輸入:num = 9輸出:"IX"
示例?4:
輸入:num = 58輸出:"LVIII"解釋:L = 50, V = 5, III = 3.
示例?5:
輸入:num = 1994輸出:"MCMXCIV"解釋:M = 1000, CM = 900, XC = 90, IV = 4.
提示:
1 <= num <= 3999
解題思路:
(1)觀察數(shù)字的組成巫财,是由幾個固定的羅馬字符組合疊加(相加)形成的
(2)于是將(1)過程逆置盗似,通過不斷和固定的數(shù)字做差,拼出羅馬數(shù)字平项。
算法:
(1)用鍵值對儲存對應(yīng)的羅馬符號和其值
(2)從最大的符號一次向后遍歷
(3)如果num大于當(dāng)前遍歷的羅馬數(shù)字赫舒,就減去,并且把符號加給最終答案
(4)當(dāng)num==0時循環(huán)結(jié)束
const pair<int, string> valueSymbols[] = {
? ? ? ? {1000, "M"},
? ? ? ? {900,? "CM"},
? ? ? ? {500,? "D"},
? ? ? ? {400,? "CD"},
? ? ? ? {100,? "C"},
? ? ? ? {90,? "XC"},
? ? ? ? {50,? "L"},
? ? ? ? {40,? "XL"},
? ? ? ? {10,? "X"},
? ? ? ? {9,? ? "IX"},
? ? ? ? {5,? ? "V"},
? ? ? ? {4,? ? "IV"},
? ? ? ? {1,? ? "I"},
? ? };
? ? ? ? string intToRoman(int num) {
? ? ? ? ? ? string res="";
? ? ? ? ? ? for (const auto &[value,sys] : valueSymbols){
? ? ? ? ? ? ? ? while (num>=value){
? ? ? ? ? ? ? ? ? ? num-=value;
? ? ? ? ? ? ? ? ? ? res+=sys;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (num==0) break;
? ? ? ? ? ? }
? ? ? ? ? ? return res;
? ? ? ? }