Римское в целое число

def romanToInt(s):
        symbol= ['I','V','X','L','C','D','M']
        value= [1,5,10,50,100,500,1000]
        dic= {k:v for k,v in zip(symbol, value)}
        sums=0
        string= [i for i in range(len(s))]
        for i in string:
            if s[i] in ['I','X','C']:
                left_index= list(dic.keys()).index(s[i])
                next_symbol= list(dic.keys())[left_index + 1]
                next2_symbol= list(dic.keys())[left_index + 2]

                if i < len(s) and (s[i]== next_symbol or s[i]== next2_symbol):
                    sums+= dic[s[i+1]] -dic[s[i]]
                    string.remove(i)
                    string.remove(i+1)
                elif i < len(s) and (s[i]!= next_symbol or s[i]!= next2_symbol):
                    sums+= dic[s[i]]
                elif i== len(s):
                    sums+= dic[s[i]]
            else:
                sums+= dic[s[i]]

        return sums

У меня возникла проблема с кодом, когда я соединил римские цифры, такие как IV, IX, XL и т. д., например «MCMXCIV», на выходе получается 2216 вместо 1994. Нужна помощь.

Правило использования римских цифр гласит: если большому значению предшествует меньшее, то маленькое значение вычитается из большего. Итак, в приведенной выше последовательности это 1000 (M) + (CM) (1000 - 100) + (XC) (100 -10) + (IV) (5 - 1) = 1000 + 900 + 90 + 4..

OldBoy 25.04.2024 18:12

Отвечает ли это на ваш вопрос? Преобразование римских цифр в целые числа в Python

Ghorban M. Tavakoly 25.04.2024 18:14

Да, но я пытаюсь исправить свое решение.

paul 25.04.2024 18:16

Я заметил, что вы изменяете строку, которую перебираете. Не знаю, какой эффект это окажет в данном конкретном случае, но в целом это не очень хорошая идея.

John Bayko 25.04.2024 19:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
66
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

def romanToInt(s):
    symbol = ['I', 'V', 'X', 'L', 'C', 'D', 'M']
    value = [1, 5, 10, 50, 100, 500, 1000]
    dic = {k: v for k, v in zip(symbol, value)}
    sums = 0
    i = 0
    while i < len(s):
        if i < len(s) - 1 and dic[s[i]] < dic[s[i + 1]]:
            sums += dic[s[i + 1]] - dic[s[i]]
            i += 2
        else:
            sums += dic[s[i]]
            i += 1
    return sums

Правильная версия с циклом while

Вы можете использовать «римский» модуль, если не хотите создавать собственное решение.

import roman

n = "MCMXCIV"

print(roman.fromRoman(n))

Гравюры: 1994 г.

Спасибо, но я хочу придерживаться своего решения

paul 25.04.2024 18:22
Ответ принят как подходящий

В вашем коде нет ничего плохого, кроме логической ошибки. Вы выполняете вычитание в цикле для нескольких букв I, X и C, но при этом не учитывается вычитание остальных букв. Поэтому вместо этого обрабатывайте вычитание для V, L, D и M в одном цикле.

symbol = ['I', 'V', 'X', 'L', 'C', 'D', 'M']
    value = [1, 5, 10, 50, 100, 500, 1000]
    dic = {k: v for k, v in zip(symbol, value)}
    
    sums = 0
    i = 0  
    
    while i < len(s):
        if s[i] in ['I', 'X', 'C']:
            current_val = dic[s[i]]
            
            # don't need lists since strings can be indexed
            if i < len(s) - 1 and (s[i:i+2] in ['IV', 'IX', 'XL', 'XC', 'CD', 'CM']):# definitely skipped a few cases
                sums += dic[s[i+1]] - current_val
                i += 2  
            else:
                sums += current_val
                i += 1
        else:
            sums += dic[s[i]]
            i += 1
        
    return sums

Но да, другие ответы определенно лучше с точки зрения кода, поскольку легче обрабатывать римские цифры справа налево, поскольку вам нужно только отслеживать следующий ввод. (хотя в лучшем случае всегда используется существующее решение)

Другие вопросы по теме