Задать вопрос
bazeyvit
@bazeyvit

Перевод римских чисел в арабские (ошибка в цикле)?

Задача: написать маленькую программу, которая переводит римские числа, содержащие I, V, X, в арабские числа

Сейчас я изучаю python, но некоторое время назад игрался с java и, если некоторые вещи я понял, то многое еще не освоено. В частности, не очень понимаю работу с циклами. Как в данном примере осуществить то, что я хочу.

Программа выдает ошибку из-за (a[i+1]) — я хочу получить следующий символ в переменной a. Я понимаю, почему такая ошибка появляется, но не понимаю, как ее обойти. Помогите, пожалуйста.


Код:
a = input()
number = 0

for i in a:
	if i=='I':
		if a[i+1]=='V':
			number+=4
		elif a[i+1]=='X':
			number+=9
		else:
			number+=1
	elif i=='V':
		number+=5
	elif i=='X':
		number+=10
	else:
		print("Something is broken")

print(number)

waiter=input()
  • Вопрос задан
  • 11793 просмотра
Подписаться 3 Оценить Комментировать
Решения вопроса 1
Используйте enumerate, которая позволит Вам иметь и индекс и значение элемента. Тогда цикл можно записать так:
for index, literal in enumerate(a):
     pass


Но Вашу задачу я решил бы так:
#!/usr/bin/env python

rule_add = {
    'I': 1,
    'V': 5,
    'X': 10,
    'L': 50,
    'C': 100,
    'D': 500,
    'M': 1000,
}

rule_div = {
    ('I', 'V'): 3,
    ('I', 'X'): 8,
    ('X', 'L'): 30,
    ('X', 'C'): 80,
    ('C', 'D'): 300,
    ('C', 'M'): 800,
}

def roman_to_arabic(roman_number):
    number = 0
    prev_literal = None
    for literal in roman_number:
        if prev_literal and rule_add[prev_literal] < rule_add[literal]:
            number += rule_div[(prev_literal, literal)]
        else:
            number += rule_add[literal]
        prev_literal = literal
    return number



import unittest

class RomanNumTest(unittest.TestCase):
    def test_roman_num(self):
        self.assertEquals(roman_to_arabic('I'), 1)
        self.assertEquals(roman_to_arabic('II'), 2)
        self.assertEquals(roman_to_arabic('III'), 3)
        self.assertEquals(roman_to_arabic('IV'), 4)
        self.assertEquals(roman_to_arabic('V'), 5)
        self.assertEquals(roman_to_arabic('VI'), 6)
        self.assertEquals(roman_to_arabic('VII'), 7)
        self.assertEquals(roman_to_arabic('VIII'), 8)
        self.assertEquals(roman_to_arabic('IX'), 9)
        self.assertEquals(roman_to_arabic('X'), 10)
        self.assertEquals(roman_to_arabic('XXXI'), 31)
        self.assertEquals(roman_to_arabic('XLVI'), 46)
        self.assertEquals(roman_to_arabic('XCIX'), 99)
        self.assertEquals(roman_to_arabic('DLXXXIII'), 583)
        self.assertEquals(roman_to_arabic('DCCCLXXXVIII'), 888)
        self.assertEquals(roman_to_arabic('MDCLXVIII'), 1668)
        self.assertEquals(roman_to_arabic('MCMLXXXIX'), 1989)
        self.assertEquals(roman_to_arabic('MMX'), 2010)
        self.assertEquals(roman_to_arabic('MMXI'), 2011)
        self.assertEquals(roman_to_arabic('MMXII'), 2012)
        self.assertEquals(roman_to_arabic('MMMCMXCIX'), 3999)
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
vsespb
@vsespb
Организовать цикл по-другому, чтобы было понятно какой по счёту символ строки анализируется. Добавить условие, сравнивающее длину строки и индекс этого символа — если символ последний в строке — все условия с a[i+1] нужно не проверять.
Ответ написан
Комментировать
red_andr
@red_andr
i в цикле это не номер текущего символа, а сам символ.
Ответ написан
Комментировать
bravebug
@bravebug
for i in len(a) if a[i]=='I':
и т.д.?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы