logo

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

ローマ字形式の文字列が与えられた場合、タスクは、この与えられたローマ字文字列を整数に変換することです。

ローマ数字 は次の記号に基づいています。



シンボル

価値



Javaリストが空です

1

5



バツ

Javaリストメソッド

10

L

50

C

文字列が長すぎる

100

D

500

M

スクラーン精度スコア

1000

例:

入力: IX
出力: 9
説明: IX は 9 を表すローマ字記号です。

入力: XL
出力: 40
説明: XLは40を表すローマ字記号です。

入力: MCIV
出力: 1904年
説明: M は 1000、CM は 900、IV は 4

隣接する角度
ローマ数字から整数への推奨練習 試してみてください!

アプローチ: ローマ数字の数字は、降順で書かれたこれらの記号の文字列です (例: 最初に M が続き、次に D が続くなど)。ただし、いくつかの特定のケースでは、4 文字が連続して繰り返されることを避けるために (IIII や XXXX など)、 減算表記 は次のようによく使用されます。

  • 前に置かれた または バツ は 1 つ少ないことを示すので、4 になります。 (5 より 1 小さい)、9 は IX (10 より 1 小さい) です。
  • バツ 前に置かれた L または C は 10 少ないことを示すため、40 になります XL (10 から 50 未満)、90 は XC (10 が 100 未満)。
  • C 前に置かれた D または M は 100 少ないことを示すため、400 は CD (100 は 500 より小さい) と 900 は CM (1000未満の100)。

ローマ数字を整数に変換するアルゴリズム:

  • ローマ数字文字列をローマ記号(文字)に分割します。
  • ローマ数字の各記号を、それが表す値に変換します。
  • インデックス 0 からシンボルを 1 つずつ取得します。
    • シンボルの現在の値が次のシンボルの値以上の場合、この値を累計に加算します。
    • それ以外の場合は、次のシンボルの値を累計に加算してこの値を減算します。

上記のアルゴリズムの実装は次のとおりです。

C++
// Program to convert Roman // Numerals to Numbers #include  using namespace std; // This function returns value // of a Roman symbol int value(char r) {  if (r == 'I')  return 1;  if (r == 'V')  return 5;  if (r == 'X')  return 10;  if (r == 'L')  return 50;  if (r == 'C')  return 100;  if (r == 'D')  return 500;  if (r == 'M')  return 1000;  return -1; } // Returns decimal value of // roman numaral int romanToDecimal(string& str) {  // Initialize result  int res = 0;  // Traverse given input  for (int i = 0; i < str.length(); i++) {  // Getting value of symbol s[i]  int s1 = value(str[i]);  if (i + 1 < str.length()) {  // Getting value of symbol s[i+1]  int s2 = value(str[i + 1]);  // Comparing both values  if (s1>= s2) { // 現在のシンボルの値 // 次のシンボル以上である res = res + s1;  } else { // 現在のシンボルの値は // 次のシンボルより小さい res = res + s2 - s1;  i++;  } } else { レス = レス + s1;  応答を返します。 } // ドライバー コード int main() { // 指定された入力が有効であるとみなします。 string str = 'MCMIV';  コート<< 'Integer form of Roman Numeral is '  << romanToDecimal(str) << endl;  return 0; }>
C
// Program to convert Roman // Numerals to Numbers #include  #include  // This function returns value // of a Roman symbol int value(char r) {  if (r == 'I')  return 1;  if (r == 'V')  return 5;  if (r == 'X')  return 10;  if (r == 'L')  return 50;  if (r == 'C')  return 100;  if (r == 'D')  return 500;  if (r == 'M')  return 1000;  return -1; } // Returns decimal value of // roman numaral int romanToDecimal(char str[]) {  // Initialize result  int res = 0;  // Traverse given input  for (int i = 0; i < strlen(str); i++)  {  // Getting value of symbol s[i]  int s1 = value(str[i]);  if (i + 1 < strlen(str))  {  // Getting value of symbol s[i+1]  int s2 = value(str[i + 1]);  // Comparing both values  if (s1>= s2) { // 現在のシンボルの値 // 次のシンボル以上である res = res + s1;  } else { // 現在のシンボルの値は // 次のシンボルより小さい res = res + s2 - s1;  i++;  } } else { レス = レス + s1;  応答を返します。 } // ドライバー コード int main() { // 指定された入力が有効であることを考慮します char str[10] = 'MCMIV';  printf('ローマ数字の整数形式は %d',romanToDecimal(str));  0を返します。 }>>
ジャワ
// Program to convert Roman // Numerals to Numbers import java.util.*; public class RomanToNumber {  // This function returns  // value of a Roman symbol  int value(char r)  {  if (r == 'I')  return 1;  if (r == 'V')  return 5;  if (r == 'X')  return 10;  if (r == 'L')  return 50;  if (r == 'C')  return 100;  if (r == 'D')  return 500;  if (r == 'M')  return 1000;  return -1;  }  // Finds decimal value of a  // given roman numeral  int romanToDecimal(String str)  {  // Initialize result  int res = 0;  for (int i = 0; i < str.length(); i++) {  // Getting value of symbol s[i]  int s1 = value(str.charAt(i));  // Getting value of symbol s[i+1]  if (i + 1 < str.length()) {  int s2 = value(str.charAt(i + 1));  // Comparing both values  if (s1>= s2) { // 現在のシンボルの値 // 次のシンボル以上です // res = res + s1;  } else { // 現在のシンボルの値は // 次のシンボルより小さい res = res + s2 - s1;  i++;  } } else { レス = レス + s1;  応答を返します。  } // ドライバー コード public static void main(String args[]) { RomanToNumber ob = new RomanToNumber();  // 与えられた入力が有効であるとみなします String str = 'MCMIV';  System.out.println('ローマ数字の整数形式' + ' は ' + ob.romanToDecimal(str));  } }>>
パイソン
# Python program to convert Roman Numerals # to Numbers # This function returns value of each Roman symbol def value(r): if (r == 'I'): return 1 if (r == 'V'): return 5 if (r == 'X'): return 10 if (r == 'L'): return 50 if (r == 'C'): return 100 if (r == 'D'): return 500 if (r == 'M'): return 1000 return -1 def romanToDecimal(str): res = 0 i = 0 while (i < len(str)): # Getting value of symbol s[i] s1 = value(str[i]) if (i + 1 < len(str)): # Getting value of symbol s[i + 1] s2 = value(str[i + 1]) # Comparing both values if (s1>= s2): # 現在のシンボルの値が大きい # 次のシンボルと等しいか res = res + s1 i = i + 1 else: # 現在のシンボルの値が大きい # 次のシンボルと等しいか res = res + s2 - s1 i = i + 2 else: res = res + s1 i = i + 1 return res # ドライバーコード print('ローマ数字の整数形式は'), print(romanToDecimal('MCMIV'))>'>C#= s2) { // 現在のシンボルの値が次のシンボルより大きい // res = res + s1;  } else { res = res + s2 - s1;  i++; // 現在のシンボルの値は // 次のシンボルより小さい } } else { res = res + s1;  i++;  応答を返します。  } // ドライバーコード public static void Main(string[] args) { GFG ob = new GFG();  // 指定された入力が有効であるとみなします。 string str = 'MCMIV';  Console.WriteLine('ローマ数字の整数形式' + ' は ' + ob.romanToDecimal(str));  } } // このコードは Shrikant13 によって提供されています>>'JavaScript= s2) { // 現在のシンボルの値 // 次のシンボル以上です // res = res + s1;  } else { // 現在のシンボルの値は // 次のシンボルより小さい res = res + s2 - s1;  i++;  } } else { レス = レス + s1;  応答を返します。  } // ドライバー コード // 指定された入力が有効であることを考慮します var str = 'MCMIV';  document.write('ローマ数字の整数形式' + ' は ' + romanToDecimal(str)); // このコードは umadevi9616 によって提供されました>>
PHP
 // Program to convert Roman // Numerals to Numbers // This function returns  // value of a Roman symbol function value($r) { if ($r == 'I') return 1; if ($r == 'V') return 5; if ($r == 'X') return 10; if ($r == 'L') return 50; if ($r == 'C') return 100; if ($r == 'D') return 500; if ($r == 'M') return 1000; return -1; } // Returns decimal value // of roman numeral function romanToDecimal(&$str) { // Initialize result $res = 0; // Traverse given input for ($i = 0; $i < strlen($str); $i++) { // Getting value of // symbol s[i] $s1 = value($str[$i]); if ($i+1 < strlen($str)) { // Getting value of // symbol s[i+1] $s2 = value($str[$i + 1]); // Comparing both values if ($s1>= $s2) { // 現在のシンボルの値 // 次のシンボル以上です $res = $res + $s1; } else { $res = $res + $s2 - $s1; $i++; // 現在のシンボルの値は // 次のシンボルより小さい } } else { $res = $res + $s1; $i++; $res を返します。 } // ドライバー コード // 指定された入力が // 有効であるとみなします $str ='MCMIV'; echo 'ローマ数字の整数形式は ', romanToDecimal($str), '
'; // このコードは ajit によって提供されました ?>>>

出力
Integer form of Roman Numeral is 1904>

複雑さの分析:

  • 時間計算量: O(n)。n は文字列の長さです。
    文字列の走査は 1 回だけ必要です。
  • 補助スペース: O(1)、余分なスペースは必要ありません。