Top.Mail.Ru
Ответы

Задача по языку Python

Пользователь вводит с клавиатуры число от 1 до 100. Требуется
перевести это число в римскую систему счисления.
Можно использовать только if (Python)!!!

По дате
По Рейтингу
Аватар пользователя
Новичок

На всяких стэковерфлоу полно готовых решений этой стандартной задачи
https://ru.stackoverflow.com/questions/1484878/Перевод-из-арабских-в-римские-числа
Алгоритм там не хитрый. Тем более если от 1 до 100.
Если наоборот из римских в арабские - там чуть посложнее будет.
Например разберем вот это

1234567891011121314
 roman_numbers = {'M': 1000, 'CM': 900, 'D': 500, 'CD': 400, 
                 'C': 100, 'XC': 90, 'L': 50, 'XL': 40, 
                 'X': 10, 'IX': 9, 'V': 5, 'IV': 4, 'I': 1} 
 
 
def to_roman(number): 
    roman = '' 
    for letter, value in roman_numbers.items(): 
        while number >= value: 
            roman += letter 
            number -= value 
    return roman 
 
print(to_roman(19)) 

Хотим перевести 19. Цикл бежит по словарю. Нашел в словаре первое значение которое меньше 19. Это 10. В пустую строку помещаем его ключ - X. От 19 отнимаем это найденное значение 10. Получаем 9. Второе значение которое меньше или равно 9 - собственно 9. К строке присоединяем его ключ из словаря - IX. И получаем наше XIX.
9 - 9 = 0

Аватар пользователя
Высший разум

Надеюсь, запрет использовать всё, кроме if, не распространяется на арифметику, операции со списками и ввод-вывод? Трудновато будет реализовать всё это на одних лишь if.

Вот, примитивно и громоздко, но с одними лишь if-ами, как требовалось:

12345678910111213141516
 n = int(input())
if not (1 <= n <= 100): raise ValueError("Число должно быть от 1 до 100")
rs = []
if n >= 90: n -= 100; rs.append('C')
if n >= 40: n -= 50; rs.append('L')
if n < 0: n += 10; rs.insert(-1, 'X')
if n >= 39: n -= 40; rs.extend('XXXX')
if n >= 29: n -= 30; rs.extend('XXX')
if n >= 19: n -= 20; rs.extend('XX')
if n >= 9: n -= 10; rs.append('X')
if n >= 4: n -= 5; rs.append('V')
if n < 0: n += 1; rs.insert(-1, 'I')
if n >= 3: n -= 3; rs.extend('III')
if n >= 2: n -= 2; rs.extend('II')
if n >= 1: n -= 1; rs.append('I')
print(''.join(rs)) 


Для сравнения, человеческий алгоритм без всяких ifов, и работает с числами до 4000:

123456789101112
 def digits(tup):
    o, f, t = tup
    return (
        '',  o,   o * 2,     o * 3,     o + f, # 0-4
        f, f + o, f + o * 2, f + o * 3, o + t  # 5-9
    )

n = int(input())
print(''.join((map(tuple.__getitem__, map(digits,
    (('M', '?', '?'), ('C', 'D', 'M'), ('X', 'L', 'C'), ('I', 'V', 'X'))),
    sum(map(divmod, divmod(n, 100), (10,) * 2), ())
)))) 

Программу на if-ах для этого диапазона потребовалось бы удвоить.

Аватар пользователя
Мастер

n = int(input("Введите число от 1 до 100: "))

if n < 1 or n > 100:
print("Число должно быть от 1 до 100!")
else:
roman_numeral = ""
if n >= 90:
roman_numeral += "XC"
n -= 90
if n >= 50:
roman_numeral += "L"
n -= 50
if n >= 40:
roman_numeral += "XL"
n -= 40
if n >= 10:
roman_numeral += "X" * (n // 10)
n %= 10
if n == 9:
roman_numeral += "IX"
n -= 9
if n >= 5:
roman_numeral += "V"
n -= 5
if n == 4:
roman_numeral += "IV"
n -= 4
if n >= 1:
roman_numeral += "I" * n
print
("Результат:", roman_numeral)