JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

ローマ数字を10進数に変換するJavaScriptアルゴリズムの実装方法

ローマ数字で表された文字列を受け取り、それを10進数(基数10)の数値に変換して返す関数を作成する必要があります。本記事では、その関数を実際のコードとともにわかりやすく解説します。

ローマ数字の基本ルール

ローマ数字は「I・V・X・L・C・D・M」の7種類の記号で構成され、それぞれ1・5・10・50・100・500・1000に対応しています。基本的には左から右へ値を足していきますが、「IV(4)」「IX(9)」「XL(40)」のように、小さい記号が大きい記号の前に置かれる場合は引き算になるという減算ルールが存在します。このルールを正しく処理することが、変換アルゴリズムのポイントです。

実装コード

const romanToInt = (s) => {
    const legend = "IVXLCDM";
    const l = [1, 5, 10, 50, 100, 500, 1000];
    let sum = 0;
    while (s) {
        if (!!s[1] && legend.indexOf(s[0]) < legend.indexOf(s[1])) {
            sum += (l[legend.indexOf(s[1])] - l[legend.indexOf(s[0])]);
            s = s.substring(2, s.length);
        } else {
            sum += l[legend.indexOf(s[0])];
            s = s.substring(1, s.length);
        }
    }
    return sum;
};
console.log(romanToInt('CLXXVIII'));
console.log(romanToInt('LXXXIX'));
console.log(romanToInt('LV'));
console.log(romanToInt('MDLV'));

アルゴリズムの仕組み

この関数は、文字列の先頭から1文字ずつ処理を進めていきます。まず、現在の文字(s[0])と次の文字(s[1])の値を比較し、現在の文字の方が小さい場合は減算ルールが適用されていると判断します。

  • 減算パターンの場合: 次の文字の値から現在の文字の値を引いた数を合計に加算し、2文字分を処理済みとして読み飛ばします(例:IV → 5 − 1 = 4)。
  • 通常パターンの場合: 現在の文字の値をそのまま合計に加算し、1文字分だけ先へ進みます。

この処理を文字列が空になるまで繰り返し、最終的な合計値を返すことでローマ数字全体の数値が求まります。

実行結果

上記のコードをコンソールで実行すると、以下の出力が得られます。

178
89
55
1555

たとえば CLXXVIII は 100 + 50 + 10 + 10 + 5 + 1 + 1 + 1 の計算で 178 となり、LXXXIX は 50 + 10 + 10 + 10 + (10 − 1) の計算で 89 となるため、減算ルールも正しく処理できていることが確認できます。

  1. バニラJavaScriptで文字列を数値に変換する方法|parseInt関数の使い方を解説

    parseInt関数とはバニラJavaScriptで文字列を数値に変換する最も基本的な方法が、グローバル関数のparseIntです。この関数は、文字列として渡された値を指定した基数(進数)に基づいて解釈し、整数を返します。構文parseInt(string, radix);各引数の意味は以下の通りです。string ― 解析対象となる値です。引数が文字列以外の場合は、ToStringメソッドによって自動的に文字列へ変換されます。また、先頭の空白文字は無視されます。radix ― 文字列の基数(数学的な記数法における底)を表す、2から36までの整数です。基数を指定してさまざまな進数を整数に変換で

  2. JavaScriptで小数を検証するには?正規表現を使った実装例を解説

    JavaScriptで小数を検証する方法 JavaScriptで、ユーザーが入力した値が正しい小数(小数点を含む数値)かどうかを判定したい場面はよくあります。そんなときに便利なのが正規表現です。本記事では、match()メソッドと正規表現を組み合わせて、入力値が小数かどうかを検証する方法を、具体的なコード例とともにわかりやすく解説します。 使用する正規表現パターン 今回の検証では、以下の正規表現を使用します。 /^[-+]?[0-9]+\.[0-9]+$/ このパターンの各要素の意味は次のとおりです。 ^[-+]?:文字列の先頭に符号(+ または -)が付いていても、付いていなくてもマッチ