Конвертер арабских чисел в римские цифры - PullRequest
0 голосов
/ 24 декабря 2018

Числа, которые не содержат 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.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

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

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 или более макронов, которые очень неясны, если они не сильно увеличены

0 голосов
/ 24 декабря 2018

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

   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   
...