banner
ekko

ekko's blog

时间不在于你拥有多少,而在于你怎样使用
github
xbox
email

ローマ数字を整数に変換する

説明#

ローマ数字には以下の 7 つの文字が含まれます:IVXLCDM

文字          数値
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例えば、ローマ数字の 2 はIIと書かれ、1 が 2 つ並んでいることを意味します。12 はXIIと書かれ、X + IIとなります。27 はXXVIIと書かれ、XX + V + IIとなります。

通常、ローマ数字では小さい数字が大きい数字の右側に配置されます。しかし、特例も存在します。例えば、4 はIIIIではなくIVと書かれます。数字 1 は数字 5 の左側にあり、大きい数 5 から小さい数 1 を引いた値である 4 を表します。同様に、数字 9 はIXと表されます。この特別なルールは以下の 6 つの場合にのみ適用されます:

  • IV(5)とX(10)の左側に配置することで、4 と 9 を表します。
  • XL(50)とC(100)の左側に配置することで、40 と 90 を表します。
  • CD(500)とM(1000)の左側に配置することで、400 と 900 を表します。

与えられたローマ数字を整数に変換してください。入力は 1 から 3999 の範囲であることが保証されています。

例 1:

入力: "III"
出力: 3

例 2:

入力: "IV"
出力: 4

例 3:

入力: "IX"
出力: 9

例 4:

入力: "LVIII"
出力: 58
説明: L = 50, V= 5, III = 3.

例 5:

入力: "MCMXCIV"
出力: 1994
説明: M = 1000, CM = 900, XC = 90, IV = 4.

アプローチ#

  • 文字列の最初から始めて、現在の位が次の位よりも低い場合は、現在の位の値を結果に加算します。そうでない場合は、現在の位の値を減算します。
  • これらの 7 つの文字の ASCII 値に基づいて、対応する配列を簡略化し、各文字の位と表す数字を比較するために使用します。実際には、これはハッシュアルゴリズムと同じです。文字をマッピングしてユニークなキーを得るために、文字を 16 進数に変換して & 0XF を取得します。
int romanToInt(char * s){
    int nums[15] = {0};
                    //10進数:16進数:2進数
    nums[9]  = 1;   //I:73:0X49:1001
    nums[6]  = 5;   //V:86:0X56:0110
    nums[8]  = 10;  //X:88:0X58:1000
    nums[12] = 50;  //L:76:0X4C:1011
    nums[3]  = 100; //C:67:0X43:0011
    nums[4]  = 500; //D:68:0X44:0100
    nums[13] = 1000;//M:77:0X4D:1101
    for(unsigned char i = 0;s[i] != '\0';i++) {
        if(nums[s[i] & 0xf] >= nums[s[i+1] & 0xf])
            nums[1] += nums[s[i] & 0xf];
        else
            nums[1] -= nums[s[i] & 0xf];
    }
    return nums[1];
}

注意事項#

  • 現在の位よりも次の位の等級が低い場合にのみ、現在の値を減算します。
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。