Преобразование целых чисел в римскую систему счисления
Нужно преобразовать заданное число в римскую систему с учетом правил представления римских цифр.
Ввод:
45
9
Вывод:
VL
IX
Реализовал преобразование без учета правил, то есть например число 45 выводится как XXXXV.
def to_rome(num): rome_nums={'M':1000,'D':500,'C':100,'L':50,'X':10,'V':5,'I':1} rome_lits=['M','D','C','L','X','V','I'] for lit in rome_lits: while num>=rome_nums[lit]: print(lit,end='') num-=rome_nums[lit]
Десятичное число в римскую систему счисления
Напишите программу, которая выводит запись заданного десятичного числа, не превосходящего 3999, в.
Вывести число, переведенное в римскую систему счисления
Формат ввода: Вводится целое число в десятичной системе счисления от 1 до 3999. Формат вывода.
Преобразование в римскую систему счисления
Нужно написать функцию для преобразования целого десятичного числа (от 1 до 3999) в римскую систему.
Перевод чисел в римскую систему счисления
Здравствуйте! Помогите, пожалуйста, с решением задачи. С клавиатуры вводится число от 0 до 100.
Перевод чисел из файла в римскую систему счисления
Во входном файле in.txt заданы целые числа в диапазоне от 1 до 3999, например: 112 24 9 3517 438.
не знаю как описать кодом, но с точки зрения логики процесса — упущено сравнение с ближайшим числом(число — 10, для чисел до 100).
типа 50-10=40 — число для второго сравнения
4540 =>.
в случае же 38
38.
=> — в данном случае обозначает знак «следовательно»
Добавлено через 25 минут
в общем случае
число для второй проверки должно формироваться из текущего минус (наименьшее число меньшего порядка).
то есть число 45 в данном коде сравнивается с 50
затем предыдущее число — это 10(X)
50-10=40(L-X)
45>=.
соответственно для тысячи сравнение идёт с 1000-100(M-C)
Сообщение было отмечено Whost как решение
Решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14
coding = zip( [1000,900,500,400,100,90,50,40,10,9,5,4,1], ["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"] ) def decToRoman(num): if num 0 or num >= 4000 or int(num) != num: raise ValueError('Input should be an integer between 1 and 3999') result = [] for d, r in coding: while num >= d: result.append(r) num -= d return ''.join(result)
Задачка с собеседования: как перевести число в римскую систему счисления и обратно
В качестве подводки к этой статье на прошлой неделе мы выпустили статью про римскую систему счисления. Вот основные правила перевода:
- В ней вместо цифр используются римские буквы: I — 1, V — 5, X — 10, L — 50, C — 100, D — 500, M — 1000.
- В античности правила перешли от сложения к вычитанию и появились шесть новых комбинаций: IV = 4, IX = 9, XL = 40, XC = 90, CD = 400, CM = 900.
- Цифры могут повторяться, но не более трёх одинаковых подряд.
- Если меньшая цифра стоит справа от такой же или большей, то они складываются друг с другом: VIII → 8.
- если меньшая цифра стоит слева от большей — вычитаем из большего меньшее: IV → 4.
Перевод из десятичной в римскую
Для перевода в римскую систему счисления сначала сделаем попарный список из десятичных чисел и их аналогов в римской системе:
all_roman = [(1000, ‘M’), (900, ‘CM’), (500, ‘D’), (400, ‘CD’), (100, ‘C’), (90, ‘XC’), (50, ‘L’), (40, ‘XL’), (10, ‘X’), (9, ‘IX’), (5, ‘V’), (4, ‘IV’), (1, ‘I’)]
Идея будет в том, чтобы сразу составить список по убыванию — от самого большого числа к самому маленькому. А теперь самое важное: благодаря тому, что мы добавили туда новые комбинации, это даёт нам возможность составлять из них любые числа.
Дело в том, что сейчас в римской системе нельзя использовать больше трёх одинаковых знаков подряд. Число 8 — это VIII, а 9 — это уже не VIIII, а IX. Чтобы нам не проверять каждый раз, что стоит слева, а что справа, мы добавили эти шесть комбинаций.
Теперь нам осталось сделать простой алгоритм, который будет работать так:
- Берёт наше число и смотрит, какое максимальное число из нашего списка можно оттуда вычесть.
- Для этого он проходит список слева направо (поэтому мы сразу отсортировали его по убыванию) и как только находит первое подходящее число — вычитает его из нашего.
- Сразу после этого он добавляет к результату букву (одну или две), которая соответствовала вычтенному числу.
- Так раз за разом алгоритм будет уменьшать наше исходное число и добавлять буквы к римскому.
- Когда от нашего числа ничего не останется (станет равно нулю), алгоритм остановится, а буквы, которые мы добавляли, и дадут нам римское число.
# формируем словарь из всех римских чисел и новых комбинаций all_roman = [(1000, 'M'), (900, 'CM'), (500, 'D'), (400, 'CD'), (100, 'C'), (90, 'XC'), (50, 'L'), (40, 'XL'), (10, 'X'), (9, 'IX'), (5, 'V'), (4, 'IV'), (1, 'I')] # функция перевода чисел в римскую систему счисления def to_roman(num): # на старте в римском числе ничего нет roman = '' # пока наше число больше нуля while num > 0: # перебираем все пары из словаря for i, r in all_roman: # пока наше число больше или равно числу из словаря while num >= i: # добавляем соответствующую букву в римское число roman += r # вычитаем словарное число из нашего числа num -= i # как все циклы закончились — возвращаем римское число return roman print("Число 2022 в римской системе = " + to_roman(2022))
Перевод из римской системы в десятичную
Когда мы знаем, как переводить из десятичной системы в римскую, то для обратного перевода надо делать то же самое, только уменьшать уже римское число. Единственная сложность — убрать из начала строки один или два символа, которые есть в нашем словаре (помним, что римское число — это строка из букв). Для этого используем двоеточие: в Python оно делит строку на части. В нашем случае мы делаем так:
- Получаем длину строки из словаря — смотрим, в ней один символ или два. Например, в паре (1000, ‘M’) в строке один символ, а в паре (900, ‘CM’) — два символа.
- Зная это, получим все символы начиная с первого или со второго символа. А так как в Python нумерация строк начинается с нуля, то мы как раз отрежем один или два символа. То, что нам нужно.
Также нам понадобится метод srt.startswith() — он возвращает true, если в начале какой-то строки присутствует искомая строка. У него много интересных параметров (например, можно искать не с начала строки, не до конца строки или даже с конца строки). Но нам сейчас понадобится просто .startswith() — если в начале нашего римского числа будет число из словаря, то это нужное нам число.
Всё остальное мы делаем точно так же — убираем из римского числа буквы и добавляем их десятичные значения к будущему результату:
# функция перевода римского числа в десятичную систему счисления def to_dec(rom): # на старте десятичное число равно нулю dec = 0 # перебираем все пары из словаря for i, r in all_roman: # пока римское число начинается буквы из словаря while rom.startswith(r): # увеличиваем десятичное число на соответствующее значение из словаря dec += i # убираем найденную букву из римского числа rom = rom[len(r):] # как все циклы закончились — возвращаем десятичное число return dec print("Число MMXXII в римской системе = " + str(to_dec("MMXXII")))
Что дальше
Впереди у нас много разборов разных задач с собеседований. Они и помогут вам попрактиковаться в коде, и покажут, на что смотрят рекрутеры, и расширят ваш кругозор.
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Конвертатор чисел из арабских в Римские, проблема с девятками
Написал прогу, которая, в зависимости от разряда и первого числа этого разряда, записывает в ответ тот или иной вариант записи числа. Так вот, все работает как надо, кроме девяток и чисел после 4 тысяч. Было бы неплохо это исправить, т.к. сам проблему не нашел. Надеюсь на максимально простой вариант и желательно — объяснение. Код ниже.
inp_='3948' roman_num= #answ_dict=<> answer='' # Var for exit multiplier=1 # Var for optimize code counter=0 # NVRMND for i in range(len(inp_)-1): # Setting the multiplier multiplier=multiplier*10 #print(multiplier) while len(inp_)!=0: # While we have at least one digit num=int(inp_[0]) # Var for make code simoly for read if 0, ') #multiplier=multiplier*10 elif num==9: # If digit is 9, we can present it as N⁞5+N(by multiplier) answer+=roman_num[multiplier]+roman_num[multiplier*10] # Adding to output number from multiplier's class and adding number from next one class print(f'9, , ') elif num==4: # If digit is 4, we can pesent it as: if len(inp_)>=4: # If digit from thousands answer+=roman_num[multiplier]*num # Number from multiplier's class printed num times else: answer+=roman_num[multiplier]+roman_num[multiplier*5] # N⁞5+N(by multiplier) print(f'4, , ') #multiplier=multiplier*10 else: # If num - digit 1-3, we can just write it num times answer+=roman_num[multiplier]*num # Adding number from multiplier's class to output by adding number num times print(f'else, , ') multiplier=multiplier/10 # Decrease class of multiplier inp_=inp_[1:] # Delete previous class print(num-5) print(answer)