罗马数字与阿拉伯数字的相互转化
題目
1
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
2
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
這兩道題就是要我們在1~3999(為什么小于4000呢?)的范圍內(nèi)將用阿拉伯?dāng)?shù)字表示的整數(shù)與用羅馬數(shù)字表示的數(shù)相互轉(zhuǎn)換。
羅馬數(shù)字
在將這兩者轉(zhuǎn)化之前,我們需要先了解一下羅馬數(shù)字及其規(guī)則。
(羅馬數(shù)字的起源,變化以及發(fā)展跟我們的主題無關(guān),想要知道的自己上網(wǎng)查找。)
羅馬數(shù)字一共有7個基本符號,分別為:I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000),括號內(nèi)的值表示其大小。注意:羅馬數(shù)字并沒有表示0的符號。
規(guī)則
1. 相同的數(shù)字連寫、所表示的數(shù)等于這些數(shù)字相加得到的數(shù)。 如 III表示 3,XX表示20。但是,一般情況下,連寫不能超過3次,V、L和D不能連寫。
2. 小的數(shù)字在大的數(shù)字的右邊,所表示的數(shù)等于這些數(shù)字相加得到的數(shù)。 如 VI 表示 6。
3. 小的數(shù)字在大的數(shù)字的左邊,所表示的數(shù)等于大數(shù)減小數(shù)得到的數(shù)。 如 IX 表示 9, CD表示400。但是,這個僅限于I在V或者X的左邊, X在L或C的左邊,C在D或M的左邊。例如99表示成 XCIX,不能表示為 IC。而且左減數(shù)字只能為一位。例如8表示成VII,不能表示成IIX。
4. 在一個數(shù)的上面畫一條橫線、表示這個數(shù)擴大 1000 倍。(由于在這兩道題目中,無法表示出來,因此最大只能表示3999,要表示5000就只能在V上面加上橫線)。
個人理解
看了上面的規(guī)則后,其實有些人對于羅馬數(shù)字的表示還可能云里霧里的。如果你把IV(4), IX(9), XL(40),XC(90),CD(400),CM(900)看成一個數(shù)字。在將一個數(shù)表示成羅馬數(shù)字的時候,按照從左到右的寫法,從大到小選擇羅馬數(shù)字符號就可以了。
例如,748 =》 DCC(700) + XL(40) + VIII =》 DCCXLVIII
?????????? 999 =》 CM(900) + XC(90) + IX =》 CMXCIX
代碼
在int->roman中,我用一個表存儲十進制數(shù)上每個位上的數(shù)字對應(yīng)的羅馬數(shù)字。在轉(zhuǎn)換的時候,只要求解出每個位置上的數(shù)字,再查表后將得到的字符連接起來就可以得出結(jié)果。
在roman->int中,用一個int類型的變量表示羅馬數(shù)字代表的值,若使用查表的方法需要先對字符串進行分割,有點麻煩,直接利用規(guī)則2和規(guī)則3,若字符str[i]表示的值小于字符str[i+1]表示的值,就減去str[i]的值,否則加上str[i+1]的值。
總結(jié)
以上是生活随笔為你收集整理的罗马数字与阿拉伯数字的相互转化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 曼联队选择Tezos作为官方区块链和训练
- 下一篇: 乒乓球单循环赛_乒乓球淘汰赛制和单循环赛