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 を表しているためです。
変換アルゴリズムの手順
この問題を解くためには、以下の手順に従います。
- 結果を格納する空文字列 res を用意します。
- (値, 記号) のペアを値の降順で並べたテーブルを作成します。
[(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")] - テーブル内の各ペア (cap, roman) に対して、以下の処理を繰り返します。
- d := num ÷ cap の商(切り捨て)
- m := num mod cap(余り)
- res := res + roman × d
- num := m
- 最終的に 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) であり、非常に効率的です。
-
Pythonでキロメートルをマイルに変換する方法|初心者向けサンプルコード付き解説
本記事では、Pythonを使って「キロメートル(km)」を「マイル(mile)」に変換するプログラムの作成方法を、初心者にもわかりやすく解説します。課題の概要今回扱う問題は次のとおりです。問題文: キロメートル単位で与えられた距離を、マイル単位に変換して出力する。変換には以下の換算式を使用します。1キロメートル = 0.621371 マイル使用する変換公式Miles = kilometer * 0.621371つまり、キロメートルの値に定数「0.621371」を掛けるだけで、マイルへの換算が可能です。それでは、実際のコードを見てみましょう。実装例kilometers = 5.5 # 換算係数:
-
Pythonで16進数の文字列を10進数に変換する方法を解説
この記事では、16進数の文字列を10進数に変換する問題の解決策について詳しく解説します。課題の概要16進数形式の文字列が与えられたとき、それを対応する10進数の値に変換することを目標とします。例えば、16進数の「F」は10進数では「15」に相当します。この問題には主に2つのアプローチがあります。力ずく(ブルートフォース)な手法:int関数を使った明示的な型変換組み込みモジュールを活用する手法:astモジュールのliteral_eval関数を使用方法1:int関数を使った変換最もシンプルで一般的な方法は、Pythonの組み込み関数であるint()を利用するものです。この関数は2つの引数を受け取り