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

Pythonで整数をローマ数字に変換する方法をわかりやすく解説

整数 num が与えられたとき、それを対応するローマ数字へ変換することを考えてみましょう。ローマ数字では、以下のような記号と値が使われます。

  • 「I」= 1
  • 「V」= 5
  • 「X」= 10
  • 「L」= 50
  • 「C」= 100
  • 「D」= 500
  • 「M」= 1000

通常、これらの記号は値が大きい順に左から右へ並べられ、すべての記号の値を合計することで数値を表します。しかし、小さい値の記号が大きい値の記号の左側に置かれる特別なケースも存在します。この場合、小さい方の値は大きい方の値から差し引かれます。

そのような減算ルールが適用されるケースの例は以下の通りです。

  • 「I」が「V」の前にある場合 → 4
  • 「I」が「X」の前にある場合 → 9
  • 「X」が「L」の前にある場合 → 40
  • 「X」が「C」の前にある場合 → 90
  • 「C」が「D」の前にある場合 → 400
  • 「C」が「M」の前にある場合 → 900

ローマ数字の基本ルール

ローマ数字には、次のような書き方のルールもあります。

  • 同じ記号は3回までしか繰り返せない(例:「III」は有効だが「IIII」は無効)。
  • 「V」「L」「D」の3つの記号は繰り返して使用できない。

たとえば、入力が n = 1520 の場合、出力は「MDXX」となります。「MDXX」は 1000 + 500 + 10 + 10 = 1520 を表しているためです。

変換アルゴリズムの手順

この問題を解くためには、以下の手順に従います。

  1. 結果を格納する空文字列 res を用意します。
  2. (値, 記号) のペアを値の降順で並べたテーブルを作成します。
    [(1000, "M"), (900, "CM"), (500, "D"), (400, "CD"), (100, "C"), (90, "XC"), (50, "L"), (40, "XL"), (10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I")]
  3. テーブル内の各ペア (cap, roman) に対して、以下の処理を繰り返します。
    • d := num ÷ cap の商(切り捨て)
    • m := num mod cap(余り)
    • res := res + roman × d
    • num := m
  4. 最終的に res を返します。

このアルゴリズムのポイントは、900・400・90・40・9・4といった減算形式のペアをあらかじめテーブルに含めておくことで、特殊ケースを意識せずに統一的な処理ができる点です。また、Pythonの組み込み関数 divmod() を使うと、商と余りを一度に取得でき、コードがより簡潔になります。

Pythonでの実装例

それでは、実際の実装を見てみましょう。

def solve(num):
    res = ""
    table = [
        (1000, "M"),
        (900, "CM"),
        (500, "D"),
        (400, "CD"),
        (100, "C"),
        (90, "XC"),
        (50, "L"),
        (40, "XL"),
        (10, "X"),
        (9, "IX"),
        (5, "V"),
        (4, "IV"),
        (1, "I"),
    ]
    for cap, roman in table:
        d, m = divmod(num, cap)
        res += roman * d
        num = m

    return res

num = 1520
print(solve(num))

入力

1520

出力

MDXX

処理の流れを確認

num = 1520 の場合、処理は以下のように進みます。

  • 1520 ÷ 1000 = 商 1、余り 520 → 「M」を追加
  • 520 ÷ 900 = 商 0 → 何も追加されず
  • 520 ÷ 500 = 商 1、余り 20 → 「D」を追加
  • 20 ÷ 10 = 商 2、余り 0 → 「XX」を追加
  • 以降は商が 0 となるため終了

結果として「MDXX」が出力されます。このアルゴリズムの計算量は O(1)(テーブルサイズが固定のため)、空間計算量も O(1) であり、非常に効率的です。

  1. Pythonでキロメートルをマイルに変換する方法|初心者向けサンプルコード付き解説

    本記事では、Pythonを使って「キロメートル(km)」を「マイル(mile)」に変換するプログラムの作成方法を、初心者にもわかりやすく解説します。課題の概要今回扱う問題は次のとおりです。問題文: キロメートル単位で与えられた距離を、マイル単位に変換して出力する。変換には以下の換算式を使用します。1キロメートル = 0.621371 マイル使用する変換公式Miles = kilometer * 0.621371つまり、キロメートルの値に定数「0.621371」を掛けるだけで、マイルへの換算が可能です。それでは、実際のコードを見てみましょう。実装例kilometers = 5.5 # 換算係数:

  2. Pythonで16進数の文字列を10進数に変換する方法を解説

    この記事では、16進数の文字列を10進数に変換する問題の解決策について詳しく解説します。課題の概要16進数形式の文字列が与えられたとき、それを対応する10進数の値に変換することを目標とします。例えば、16進数の「F」は10進数では「15」に相当します。この問題には主に2つのアプローチがあります。力ずく(ブルートフォース)な手法:int関数を使った明示的な型変換組み込みモジュールを活用する手法:astモジュールのliteral_eval関数を使用方法1:int関数を使った変換最もシンプルで一般的な方法は、Pythonの組み込み関数であるint()を利用するものです。この関数は2つの引数を受け取り