Конвертер арабских чисел в римские цифры: число, содержащее 4, не будет преобразовано

1

Числа, которые не содержат 4, просто преобразуются, но после проверки числа, содержащего 4, они не преобразуются должным образом.

Я новичок в Python, и я изо всех сил пытаюсь увидеть, что было не так в коде. Код для преобразования арабских чисел в римские цифры работает для чисел, которые не содержат 4 в них. Я попытался проверить с другой комбинацией чисел. Коды, расположенные перед приведенным ниже, в значительной степени определяют количество тысяч, пяти сотен, сотен и т.д. Во введенном числе. Кто-нибудь может мне помочь?

def display_roman(M, D, C, L, X, V, I):

    CM = 0
    CD = 0
    XC = 0
    XL = 0
    IX = 0
    IV = 0

    if D == 2:
        M += 1
        D -= 2
    elif L == 2:
        C += 1
        L -= 2
    elif V == 2:
        X += 1
        V -= 2

    if V == 1 and I == 4:
        V = 0
        I = 0
        IX = 1
    elif I == 4:
        I == 0
        IV == 1
    if X == 4:
        X == 0
        XL == 1
    if L == 1 and X == 4:
        L == 0
        X == 0
        XC == 1
    if C == 4:
        C == 0
        CD == 1
    if D == 1 and C == 4:
        D == 0
        C == 0
        CM == 1

    print("The roman numeral of your number is: ")
    print("M" * M, "CM" * CM, "D" * D, "CD" * CD, "C" * C,"XC" * XC, "L" * L, "XL" * XL, "X" * X, "IX" * IX, "V" * V, "IV" * IV, "I" * I)

Если я введу числа, такие как 4 или 14, я ожидаю получить IV и XIV соответственно. Но фактические результаты - IIII и XIIII соответственно.

Пожалуйста помоги. Извините, если что-то не так с форматом моего вопроса, так как я также новичок в stackoverflow. Заранее спасибо.

  • 1
    Как вы вызываете эту функцию? Мне кажется, у вас есть проблема с реализацией: нет способа отличить IV от VI .
  • 0
    Кажется, вы используете == вместо = в ваших последующих заданиях; это не поможет вашему делу. И эта разбивка начинается с действий после теста I == 4 .
Показать ещё 6 комментариев
Теги:
python-3.x
roman-numerals

2 ответа

3
Лучший ответ

Добро пожаловать на ТАК! Проблема в том, как вы пытаетесь определить и изменить свои переменные. Например, этот кусок кода:

   elif I == 4:
       I == 0
       IV == 1

должен выглядеть так:

   elif I == 4:
       I = 0
       IV = 1

== это логический оператор, который вернет True если два значения одинаковы, и False если они не совпадают. = это правильный способ присвоения нового значения переменной. После изменения все работает как задумано.


display_roman(0, 0, 0, 0, 0, 0, 4)
display_roman(0, 0, 0, 0, 0, 1, 4)

The roman numeral of your number is: 
       IV 
The roman numeral of your number is: 
     IX   
  • 0
    С удовольствием :) приятного вечера!
0

Это преобразует любое натуральное число в строку с римскими цифрами:

def roman(num: int) -> str:

    chlist = "VXLCDM"
    rev = [int(ch) for ch in reversed(str(num))]
    chlist = ["I"] + [chlist[i % len(chlist)] + "\u0304" * (i // len(chlist))
                    for i in range(0, len(rev) * 2)]

    def period(p: int, ten: str, five: str, one: str) -> str:
        if p == 9:
            return one + ten
        elif p >= 5:
            return five + one * (p - 5)
        elif p == 4:
            return one + five
        else:
            return one * p

    return "".join(reversed([period(rev[i], chlist[i * 2 + 2], chlist[i * 2 + 1], chlist[i * 2])
                            for i in range(0, len(rev))]))

Тестовый код:

print(roman(6))
print(roman(78))
print(roman(901))
print(roman(2345))
print(roman(67890))
print(roman(123456))
print(roman(7890123))
print(roman(45678901))
print(roman(234567890))

Выход:

VI
LXXVIII
CMI
MMCCCXLV
L̄X̄V̄MMDCCCXC
C̄X̄X̄MMMCDLVI
V̄̄M̄M̄D̄C̄C̄C̄X̄C̄CXXIII
X̄̄L̄̄V̄̄D̄C̄L̄X̄X̄V̄MMMCMI
C̄̄C̄̄X̄̄X̄̄X̄̄M̄V̄̄D̄L̄X̄V̄MMDCCCXC

Обратите внимание, что целые числа, превышающие 9 миллионов, представлены символами, содержащими 2 или более макрона, что очень непонятно, если только они плохо масштабированы

Ещё вопросы

Сообщество Overcoder
Наверх
Меню