11616:Roman Numerals ★★☆☆☆ 題組:Problem Set Archive with Online Judge 解題者:陳仕軒、邱珮珊 解題日期:2015年4月29日 題意:本題請你做羅馬數字與阿拉伯數字的轉換,羅馬數字以英文字母表示數目,其對應關係如下: Letter I V X L C D M Value 1 5 10 50 100 500 1000 輸入有多筆測試資料,每筆資料會有一個阿拉伯數字或是一個羅馬數字,其值為 n (0 < n < 4000)。請在每一列輸出轉換結果。
歸納: 1. 因為題目數字只到3999,所以「加線乘千」用不到 2. 左邊比右邊大,直接加 3. 左減的規則只會發生在I、X、C 4 歸納: 1. 因為題目數字只到3999,所以「加線乘千」用不到 2. 左邊比右邊大,直接加 3. 左減的規則只會發生在I、X、C 4. I右邊為V、X ; X右邊為L、C ; C右邊為D、M左減就會發生 5. 綜合上述,我們將羅馬數字重新定義為I(1)、IV(4)、V(5)、IX(9)、X(10)、XL(40)、L(50)、XC(90)、C(100)、CD(400)、D(500)、CM(900)、M(1000),測資中阿拉伯數字都能用這13種組合所組合出來。 EX: MCMLXXXIII = M CM L X X X I I I =1000+900+50+10+10+10+1+1+1=1983
題意範例: XXV 25 4 IV 942 CMXLII MCMLXXXIII 1983 解法:使用字串先將所有東西讀進來,判斷第一個字是數字還是英文字母,如果是數字便輸出羅馬數字,若是英文字母便輸出數字。 阿拉伯數字轉羅馬數字: 由大到小依序判斷我們所定義的那13種符號,若原來的質大於該符號所代表的阿拉伯數字,便將原來的質減去該符號所代表的阿拉伯數字,然後輸出該符號即可。 羅馬數字轉阿拉伯數字: 判斷當前字元,從左到右依序加總,若遇到I、X、C時,就確認與下一個字元的搭配是否有符合我們所定義的符號,若有就加上該符號代表的質,然後繼續加總。
解法範例: 阿拉伯數字轉羅馬數字: Now_value = 942 Now_value compare action Roman format 942 942 < 1000 ☓ ☓ 942 942 >= 900 942-900 CM 42 42 < 900 ☓ CM 42 42 < 500 ☓ CM 42 42 < 400 ☓ CM 42 42 < 100 ☓ CM 42 42 < 90 ☓ CM 42 42 < 50 ☓ CM 42 42 > 40 42-40 CMXL 2 2 < 40 ☓ CMXL 2 2 < 10 ☓ CMXL 2 2 < 9 ☓ CMXL 2 2 < 5 ☓ CMXL
2 2 < 5 ☓ CMXL 2 2 < 4 ☓ CMXL 2 2 >= 1 2-1 CMXLI 1 1 >= 1 1-1 CMXLII Answer: CMXLII 羅馬數字轉阿拉伯數字: sum=0 string= MCMLXXXIII Now_char Next_char action value M ☓ sum += 1000 1000 C M sum += 900 1900 L ☓ sum += 50 1950 X X sum += 10 1960 X X sum += 10 1970 X I sum += 10 1980 I I sum += 1 1981
I I sum += 1 1982 I I sum += 1 1983 Answer: 1983 討論: 1. UVA上,題目中的XC=900是錯的,不要被騙囉,XC=90。