Задача по языку Python
Пользователь вводит с клавиатуры число от 1 до 100. Требуется
перевести это число в римскую систему счисления.
Можно использовать только if (Python)!!!
На всяких стэковерфлоу полно готовых решений этой стандартной задачи
https://ru.stackoverflow.com/questions/1484878/Перевод-из-арабских-в-римские-числа
Алгоритм там не хитрый. Тем более если от 1 до 100.
Если наоборот из римских в арабские - там чуть посложнее будет.
Например разберем вот это
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-ами, как требовалось:
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:
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)