如何将 Python 整数转换为罗马数字,反之亦然?

How to convert Python Integer to Roman Numeral and vice-versa?

我正在尝试编写一个 Python 程序,它接受整数作为输入并显示等效的罗马数字,反之亦然。该程序应该用 OOP 编写。我现在有 class 的结构及其方法,但我无法执行转换,有人知道使用 OOP 解决我的问题的好方法吗?这是我在 Python 学习科学计算的过程中布置的作业。我对您可能拥有的其他好的方法持开放态度,只要它在 OOP 中,就可以遵循并满足下面给定的测试用例。

重要要求:

见 Roman Numerals Table

import sys


class Convert:
    """Accepts integer as input and display
    the equivalent roman numeral and vice-versa.
    """

    def __int__(self, user_input):
        """Initialize attributes."""
        self.user_input = user_input

    def int_to_roman(self):
        """Convert integer input to roman."""
        pass

    def roman_to_int(self):
        """Convert roman input to integer."""
        pass


# Main Menu
def main():
    print("\nMENU")
    print("[1] Convert an Integer to a Roman Numeral")
    print("[2] convert a Roman Numeral to an Integer")
    print("[3] exit")


while True:
    main()
    choice = eval(input("\nEnter your choice: "))

    if choice == 1:
        # call int_to_roman() method
        # after output, return to main()
        pass
    elif choice == 2:
        # call roman_to_int() method
        # after output, return to main()
        pass
    elif choice == 3:
        sys.exit()


**TEST CASE 1**

MENU
[1] Convert an Integer to a Roman Numeral
[2] Convert a Roman Numeral to an Integer
[3] exit

Enter your choice: 1
Enter Integer: 1
Output in Roman Numeral is: I

Enter Integer: 3000
Output in Roman Numeral is: MMM

------------------------------------

**TEST CASE 2**

Enter your choice: 2
Enter Roman Numeral: MMM
Output in Integer is: 3000

Enter Roman Numeral: I
Output in Integer is: 1

这是我对此的 OOP 方法的看法。

我们有一个 class 数字,可以用 3 种方式之一构造。使用普通 int、int 的字符串表示或罗马数字。

值的内部表示被转换为普通 int。

用户可以使用 class 的 asInteger() 和 asRoman() 函数将 class 的值检索为 int 或罗马数字。这些方法不受 class 构造方式的影响。

用户可以使用普通 int 或数字的其他实例执行加法或减法 class。

使用示例如下代码:

class Number:
    control = [
        (1000, 'M', 1),
        (900, 'CM', 2),
        (500, 'D', 1),
        (400, 'CD', 2),
        (100, 'C', 1),
        (90, 'XC', 2),
        (50, 'L', 1),
        (40, 'XL', 2),
        (10, 'X', 1),
        (9, 'IX', 2),
        (5, 'V', 1),
        (4, 'IV', 2),
        (1, 'I', 1)]

    def __init__(self, value):
        if isinstance(value, int):
            self.value = value
        elif value.isdigit():
            self.value = int(value)
        else:
            self.value = self._toInteger(value)
            if value != self.toRoman(self.value):
                raise ValueError('Not a valid Roman numeral')

    def asInteger(self):
        return self.value

    def asRoman(self):
        return self.toRoman(self.value)

    def toRoman(self, num):
        if num == 0:
            return ''
        for v, c, _ in Number.control:
            if num >= v:
                return c + self.toRoman(num-v)

    def _toInteger(self, num):
        result, offset = 0, 0
        for c, r, l in Number.control:
            while num[offset:].startswith(r):
                result += c
                offset += l
        return result
    
    def __add__(self, o):
        if isinstance(o, Number):
            self.value += o.value
        elif isinstance(o, int):
            self.value += o
        else:
            raise ValueError
        return self
    
    def __sub__(self, o):
        if isinstance(o, Number):
            self.value -= o.value
        elif isinstance(o, int):
            self.value -= o
        else:
            raise ValueError
        return self


n = Number('MCMI')
m = Number(5)
print(n.asRoman())
n += m
print(n.asRoman())
m = 4
n -= m
print(n.asRoman())

输出:

MCMI
MCMVI
MCMII