Перевод арабских чисел в римские программа

Римские цифры и числа

Конвертер римских чисел онлайн

Введите число, используя арабские (0…9) или римские (I, V, X, L, C, D, M) цифры, и нажмите кнопку Конвертировать .
Корректно конвертируются целые числа от 1 до 3 999 (от I до MMMCMXCIX).

Принципы римской системы счисления

В настоящее время в римской системе счисления используются следующие знаки:

  • I = 1;
  • V = 5;
  • X = 10;
  • L = 50;
  • C = 100;
  • D = 500;
  • M = 1000.

Все целые числа от 1 до 3999 записываются с помощью приведенных выше цифр. При этом:

  • если большая цифра стоит перед меньшей, они складываются:
  • VI = 5 + 1 = 6;
  • XV = 10 + 5 = 15;
  • LX = 50 + 10 = 60;
  • CL = 100 + 50 = 150;
  • если меньшая цифра стоит перед большей (в этом случае она не может повторяться), то меньшая вычитается из большей; вычитаться могут только цифры, обозначающие 1 или степени 10; уменьшаемым может быть только цифра, ближайшая в числовом ряду к вычитаемой:
  • IV = 5 — 1 = 4;
  • IX = 10 — 1 = 9;
  • XL = 50 — 10 = 40;
  • XC = 100 — 10 = 90;
  • цифры V, L, D не могут повторяться; цифры I, X, C, M могут повторяться не более трех раз подряд:
  • VIII = 8;
  • LXXX = 80;
  • DCCC = 800;
  • MMMD = 3500.
  • черта над цифрой увеличивает ее значение в 1 000 раз:
  • V= 5 000;
  • X= 10 000;
  • L= 50 000;
  • C= 100 000;
  • D= 500 000;
  • M= 1 000 000.

Источник

Из Басры в Рим. Преобразовываем арабские числа в римские

Доброе время суток, Хабраюзер.

Разрабатывая в основном для платформы J2ME, я всегда старался вносить какие то изюминки в свои проекты. Так, однажды, мне понадобилось выделить пункты меню.

Стандартное решение, через тире или пронумеровав их, использовать не очень хотелось, но другие варианты тогда у меня отсутствовали. Обдумывая как бы лучше оформить эти пункты, я случайно наткнулся на свою старую школьную тетрадку по истории, в которой пункты были пронумерованы с использованием римских цифр. Бинго!

Стоит признаться, на то время моих познаний в римских цифрах хватало только для подсчета до второго-третьего десятка. Что вообще то для нумерации пунктов должно было хватить. Но как любой программист, захотелось иметь готовое решение, которое смогло бы переводить любые целые десятичные арабские числа в эквивалентные им римские.

В Википедии нашлась статья с описанием Римской СС, и вскоре я набросал алгоритм перевода из арабских чисел в римские.

I — 1
V — 5
X — 10
L — 50
C — 100
D — 500
M — 1000

Ноль отсутствует вообще, поэтому будем использовать пустое значение.

Итак, сам алгоритм достаточно прост:

1. Выделяем (если есть) количество целых тысяч. Полученное значение позволить сгенерировать строку с n количеством «M» (читаем, n*1000).
Пример: 2012 после первого пункта даст «MM»

2. Получаем остаток после деления на 1000, чтобы выделить в дальнейшем следующие значения.

3. Выделяем (если возможно), целые 500. При этом учитываем что если полученное значение равно 4 (5+4=9), то следует записывать как значение 1000-100, что в римский СС равнозначно «CM».
Пример: 1887 после этого пункта даст нам «MD».
1945 соответственно «MCM».

4. Получаем остаток от деления на 500.

5. Делим на 100 чтобы выделить целые сотни и складываем к предыдущему результату. Учитываем что если получили 4, что равнозначно 400, то записываем как 500-100, то есть «CD».
Пример: 1709 даст после этого шага «MDCCC».

6. Получаем остаток от деления на 100.

7. Выделяем из него целые пол сотни. Если значение будет равно 4 (то есть 90), то записываем как 100-10, что равно «XC». Иначе прибавляем к строке «L»
Пример: 1986 после всего выдаст нам «MCML».

8. Выделяем остаток от 50.

9. Выделяем целое количество десятков и складываем к строке n раз символ «X». При этом учитываем что 40 пишется как 50-10, то есть «XL».
Пример: 1986 после всего выдаст нам «MCMLXXX».

10. Получаем остаток от деления на 10. Этот шаг отличается от других тем, что можно сразу приравнять остаток к его эквиваленту. 1=I, 7=VII и так далее.

После перебора числа этим алгоритмом мы получаем примерно такое:
2012 == MMXII
Ниже исходник на Java, реализующий алгоритм.

Источник

0b1001 путей решения задачи перевода чисел в римскую запись

Привет друзья. Вот вам простенькая задачка. Как бы вы перевели арабские числа в римские используя Python? Правда с одним условием — числа не могут быть больше чем 4000.

Я думаю это должно быть просто, но позвольте я вам покажу вам серию интересных решений и не тривиальных подходов:

«13 шагов» от StefanPochmann

Очень простая идея и при этом самая популярная. Мы делаем таблицу соответствий арабских и римских чисел. Идя по таблице этих соответствий мы уменьшая арабское число и увеличиваем римское.

Я добавил функцию print для вас, чтобы решение было понятнее. И вот какой будет вывод:

Теперь вы видите, как на каждой итерации меняется римское и арабское числа.

«thous, hunds, tens и ones» от mdeakyne

В этом случае у нас уже есть обратное соответствие арабских к римским. При этом нам уже не нужен цикл.

«base.replace» от MaikSchoepe

Я верю, что это не самый эффективный способ решения, но один из самых веселых. Он начинается с того, что делает длинную строку из “I”, размером с переданное число. Следующей строй заменяет каждые пять символов “I” на символ “V”. Далее два “V” на “X” и так далее. В конце пути мы получим строку, которую мы искали.

«Enum» от veky

Для того, чтобы понять, как работает следующее решение вам надо знать модуль Enum. Если не знаете — есть отличный шанс погуглить его.

В целом пример работает так-же как мы видели в первом примере от StefanPochmann, но кое-каким синтаксическим сахором. Таким как Enum и yield

«A derelict battery» от veky

Все эти решения я собрал с CheckiO.

И когда пользователь публикует свое решение на этом ресурсе — он должен выбрать, в какую категорию он хочет его добавить. Есть такая категория как “Creative”, где тебе не надо сильно заморачиваться на тему скорости или как легко твое решение читается. Единственная вещь, о который ты должен думать — это на сколько креативное и необычное твое решение.

Это решение как раз из такое категории.

Да, вот и все. Стоит упомянуть, правда, что модуль formater задеприкейтили начиная с версии 3.4 из-за того, что мало кто его использовал. Так что мы скорее всего напишем петицию Гвидо, чтобы оставить этот модуль в Python. Своим ап-вотом за это решение — вы как-бы ставите свою подпись под этой петицией.

«Достаточно элегантно, но не очень по питоновски» от nathan.l.cook

Мы идем дальше и решения становятся тяжелее

Знаете, когда читаешь чье то решение и первые строки, которые ты видишь это:

Ты думаешь: “Ок, тут ща точно будет какая-то магия”

«Немного истории от» от veky (или от …)

Вы можете знать автора этого решения по таким книгам как The Art of Computer Programming, Concrete Mathematics, Surreal Numbers и так далее.

«Эта странная римская математика» от LukeSolo

Довольно часто ты встречаешь решения на CheckiO, и при этом ты даже не представляешь, как они работают:

Но я думаю, что вы разберетесь 🙂

Спасибо

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

Это первый раз, когда я пытаюсь поделится такой вот коллекцией наиболее интересных решений на CheckiO. Дайте мне знать, насколько интересно вам о таком читать и на сколько вам нравится сам формат.

Для создания этой статьи использовались решения пользователей CheckiO:

Источник

Оцените статью
( Пока оценок нет )
Поделиться с друзьями
Uchenik.top - научные работы и подготовка
0 0 голоса
Article Rating
Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии