阿拉伯数字转罗马数字转换器:包含4的数字不会转换

Arabic number to Roman Numeral Converter: Number containing 4 will not convert

不包含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。

请帮忙。如果我的问题格式有问题,我很抱歉,因为我也是 Whosebug 的新手。提前谢谢你。

欢迎来到 SO! 问题在于您尝试定义和更改变量的方式。比如这段代码:

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

应该看起来像这样:

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

== 是一个布尔运算符,如果两个值相同,则将 return 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

请注意,大于900万的整数由包含2个或更多长音符的字符表示,除非按比例放大,否则非常不清楚

print("ARABIC TO ROMAN CONVERTER [1-3999]:- \n \n")
x=int(input("ENTER THE ARABIC NUMBER: "))
b=["",'I','II','III','IV','V','VI','VII','VIII','IX','X','XX','XXX','XL','L','LX','LXX','LXXX','XC','C','CX','CXX','CXXX','CXL','CL','CLX','CLXX','CLXXX','CXC','CC','CCC','CD','D','DC','DCC','DCCC','CM','M']
d=["",'X','XX','XXX','XL','L','LX','LXX','LXXX','XC']
e=["",'C','CC','CCC','CD','D','DC','DCC','DCCC','CM']
if x in range(1,1000):
    print(e[int((((int(x/100))*100)-1000)/100)]+d[int((x-(int(x/100)*100))/10)]+b[((x%1000)%100)%10])
if x==1000:
    print(b[37])
if x in range(1001,2000):
    print(b[37]+e[int((((int(x/100))*100)-1000)/100)]+d[int((x-(int(x/100)*100))/10)]+b[((x%1000)%100)%10])
if x==2000:
    print("MM")
if x in range(2001,3000):
    print(b[37]+b[37]+e[int((((int(x/100))*100)-2000)/100)]+d[int((x-(int(x/100)*100))/10)]+b[((x%1000)%100)%10])
if x==3000:
    print("MMM")
if x in range(3001,4000):
    print(b[37]+b[37]+b[37]+e[int((((int(x/100))*100)-3000)/100)]+d[int((x-(int(x/100)*100))/10)]+b[((x%1000)%100)%10])
if x not in range(1,4000):
    print("Error")

两行搞定! (上限为 4000) 这是代码:

n,k = {0:'',1:'I',2:'II',3:'III',4:'IV',5:'V',6:'VI',7:'VII',8:'VIII',9:'IX',10:'X',20:'XX',30:'XXX',40:'XL',50:'L',60:'LX',70:'LXX',80:'LXXX',90:'XC',100:'C',200:'CC',300:'CCC',400:'CD',500:'D',600:'DC',700:'DCC',800:'DCCC',900:'CM',1000:'M',2000:'MM',3000:'MMM',4000:'MMMM'},int(input('ARABIC TO ROMAN CONVERTER:-\n\n>> Enter Arabic Number: '))
print('>> Arabic Equivalent:',n[(k//1000)*1000] + n[((k-((k//1000)*1000))//100)*100] + n[((k-(((k-((k//1000)*1000))//100)*100)-(k//1000)*1000)//10)*10] + n[k%10])