Римские цифры перевод python

Преобразование целых чисел в римскую систему счисления

Нужно преобразовать заданное число в римскую систему с учетом правил представления римских цифр.
Ввод:
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.
=> — в данном случае обозначает знак «следовательно»

Читайте также:  Pdf to html модуль

Добавлено через 25 минут
в общем случае
число для второй проверки должно формироваться из текущего минус (наименьшее число меньшего порядка).
то есть число 45 в данном коде сравнивается с 50
затем предыдущее число — это 10(X)
50-10=40(L-X)
45>=.

соответственно для тысячи сравнение идёт с 1000-100(M-C)

Эксперт NIX

Лучший ответ

Сообщение было отмечено 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 оно делит строку на части. В нашем случае мы делаем так:

  1. Получаем длину строки из словаря — смотрим, в ней один символ или два. Например, в паре (1000, ‘M’) в строке один символ, а в паре (900, ‘CM’) — два символа.
  2. Зная это, получим все символы начиная с первого или со второго символа. А так как в 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")))

Что дальше

Впереди у нас много разборов разных задач с собеседований. Они и помогут вам попрактиковаться в коде, и покажут, на что смотрят рекрутеры, и расширят ваш кругозор.

Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём!

В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.

Источник

Конвертатор чисел из арабских в Римские, проблема с девятками

Написал прогу, которая, в зависимости от разряда и первого числа этого разряда, записывает в ответ тот или иной вариант записи числа. Так вот, все работает как надо, кроме девяток и чисел после 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) 

Источник

Оцените статью