Числа, которые не содержат 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. Заранее спасибо.
Добро пожаловать на ТАК! Проблема в том, как вы пытаетесь определить и изменить свои переменные. Например, этот кусок кода:
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
Это преобразует любое натуральное число в строку с римскими цифрами:
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 или более макрона, что очень непонятно, если только они плохо масштабированы
IV
отVI
.==
вместо=
в ваших последующих заданиях; это не поможет вашему делу. И эта разбивка начинается с действий после тестаI == 4
.