Конвертирование арабских цифр в римские


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

Калькулятор

Перевод любых чисел от 1 до 3999 в римские числа и определение века для указанного года.

Года римскими цифрами. Таблица

Таблица соответствия годов в арабской и римской записи в диапазоне от 1890 до 2020 года.

Века римскими цифрами

Таблица соответствия года и века римскими цифрами в диапазоне от 1 до 2100 года.

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

В римском исчислении используют всего семь заглавных букв латинского алфавита.

Натуральные числа записываются при помощи повторения этих цифр.

При этом, если большая цифра стоит перед меньшей, то они складываются (принцип сложения), если же меньшая стоит перед большей, то меньшая вычитается из большей (принцип вычитания).

Последнее правило применяется только для исключения четырёхкратного повторения одной и той же цифры.

Некоторые из цифр (I, X, C, M — единицы в соответствующих разрядах) могут повторяться, но не более трёх раз подряд.

Принцип вычитания применяется только к шести числам:

С помощью римских цифр можно записать любое целое число, но не более 3999 (MMMCMXCIX).

В качестве примера это число и рассмотрим. Выделяем разряды — MMM’CM’XC’IX:

  • MMM — Три подряд символа 1000, т.е. это запись числа 3000
  • CM — Единица в разряде сотен стоит перед десятью в разряде сотен, т.е. применяется принцип вычитания. Это запись числа 900
  • XC — Единица в разряде десятков стоит перед десятью в разряде десятков, т.е. применяется принцип вычитания. Это запись числа 90
  • IX — Единица стоит перед десятью, т.е. применяется принцип вычитания. Это запись числа 9

В сумме получается 3000 + 900 + 90 + 9 = 3999.

Конвертер арабских в римские цифры C ++ — циклов проверки входных данных

Цель этой программы состоит в том, чтобы взять арабское число и вернуть римское число равного числа. он должен отклонять ввод меньше 0 и больше 3999, но также заканчиваться вводом ЛЮБОГО ОТРИЦАТЕЛЬНОГО НОМЕРА. Также требуется вводить ошибку при вводе буквы вместо целого числа. (совершенно невежественен в этой части ?!)
Мой вопрос заключается в том, в каком порядке должны находиться эти условные выражения, чтобы программа не просто возвращала неверный ввод для отрицательного числа, а заканчивала программу.

Решение

Возможное решение с минимальным рефакторингом вашего текущего кода:

Другие решения

Пробуй ловить блоки (для ловли исключений вы знаете, что ваша программа должна обрабатывать)

СТД :: стои функция из библиотеки cpp для преобразования строки в целое число

Надеюсь, это поможет, дайте мне знать, как это происходит.

Я пересмотрел начало основного метода и начало цикла while.

Но я хотел бы также предоставить альтернативную реализацию преобразования строки (из http://rosettacode.org/wiki/Roman_numerals/Encode#C.2B.2B ):

Я хотел бы предложить вам этот код C ++ 14:


Перевод римских чисел в арабские и наоборот

Я в Си программирую недавно, помогите пожалуйста решить.

Разработать программу для перевода чисел, записанных римскими цифрами в числа, записанные арабскими, и наоборот.
1 I
5 V
10 X
50 L
100 C
500 D
1000 M

Например: 46 XLVI ; 583 DLXXXIII; 888 DCCCLXXXVIII; 1989 MCMLXXXIX

09.12.2011, 22:00

Перевод римских чисел в арабские
Доброй ночи всем. Нужны наиболее рациональные и простые в реализации идеи для решения задачи. Дан.

Перевод римских цифр в арабские
Нужно написать программу перевода римских чисел в арабские. Есть эта программа на c#, но нужна на.

Из римских чисел в арабские в файле
Здравствуйте. Дана задача — в данном тексте заменить все римские числа на арабские. Вот я и не могу.

Перевод римских чисел в десятичные
Напишите программу перевода римских чисел в десятичные. Алгоритм перевода представлен в следующей.

Перевод чисел из системы счисления по основанию 16 в 8 и наоборот из 8 в 16
написать программу которая переводит числа из системы счисления по основанию 16 в 8 и наоборот из 8.

Илон Маск рекомендует:  Определение географической принадлежности IP-адреса
09.12.2011, 22:12 2 09.12.2011, 22:35 [ТС] 3 09.12.2011, 22:38 4

Вы хоть сами что-то напишите, идеи свои или код

Чем вам поможет тупо скопированный чужой код

По идее нужно двигаться с конца, и сразу выводить. То есть числа переводите в массив и выводите сразу.

09.12.2011, 22:38
09.12.2011, 22:39 5
09.12.2011, 23:43 6

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

10.12.2011, 06:03 7

В строке 17 переменная i объявлена как size_t,а значит как минимум не может принимать отрицательные значения. В связи с этим в цикле (строка 24) условие i >= 0 будет всегда TRUE и от сюда следует бесконечный цикл.
Возможно я чего-то не понимаю конечно или мой компилятор minGw чего то не понимает, но я бы в место size_t объявил переменнаю i с типом int. В таком случае в бесконечный цикл не провалится.

Добавлено через 2 минуты
еще хотел бы добавить что программа на мой взгляд не совсем корректна. т.к. числа типа ХХХХ или IIIIIII программой считаются верными. Хотя они долны иметь запись XL и IIX, соответственно.

Перевод римских чисел в арабские. Пример автоматного распознавателя

Задача

Можно использовать вложенные операторы case. Это удобно, например, при реализацииавтоматных распознавателей, которые дают способ наглядной записи алгоритмов распознавания текстов.

Представленная таблица предназначена для перевода римских чисел, составленных из цифр X, V, I.

Решение

Алгоритм решения задачи:

X V I
1 n := 10; state := 2 n := 5; state := 3 n := 1; state := 6
2 n := n + 10; state := 2 n := n + 5; state := 3 n := n + 1; state := 6
3 ok := false ok := false n := n + 1; state := 4
4 ok := false ok := false n := n + 1; state := 5
5 ok := false ok := false n := n + 1; state := 7
6 n := n + 8; state := 7 n := n + 3; state := 7 n := n + 1; state := 5
7 ok := false ok := false ok := false


Первый столбец (цифры от 1 до 7) – это состояния (state).

Для расшифровки XIV начинаем с состояния 1. Первый символ – ‘X’, поэтому смотрим столбец ‘X’ и находим n := 10; state := 2. Итак, полагаем n равным 10 и сдвигаем стрелку на вторую строку. Теперь смотрим столбец, определяемый вторым символом, т.е. ‘I’, и находим n := n + 1; state := 6. Значение n, таким образом, становится 10 + 1 = 11. Сдвигаем стрелку к строке 6. Теперь в столбце ‘V’ находим n := n + 3; state := 7. Значение n становится равным 11 + 3 = 14. Сдвигаем стрелку на строку 7 и замечаем, что любая следующая цифра ‘X’, ‘V’ или ‘I’ будет теперь ошибкой (чисел XIVX, XIVV, XIVI не может быть).

Эта таблица позволяет декодировать римскую запись чисел, содержащих любое количество цифр X (в начале) и цифры V, I, записанные по обычным правилам:
I, II, III, IV, V, VI, VII, VIII, IX, X, XI и т.д.

Вместе с тем такое число как IIII будет воспринято как ошибочное и переменная ok примет значение false. Для работы с цифрами M, D, C и L таблицу можно расширить.

Программа на языке Паскаль:

Программа не выдает ошибок, но и не работает.

О римских цифрах

Описание записи числа римскими цифрами. Конвертер между римскими цифрами и десятичными цифрами.

Римляне, как известно, использовали для записи числа латинские буквы.

Считается, что римская система счисления является классическим примером непозиционной системы счисления, то есть такой системы счисления, в которой величина, которую обозначает цифра, не зависит от положения в числе.

Напомним, что в римской системе счисления I обозначает 1, V обозначает 5, X — 10, L — 50, C — 100, D — 500, M — 1000.
Например, число 3 в римской системе счисления будет обозначаться как III.

Однако на самом деле не все так просто, и она не является полностью непозиционной системой счисления, потому что в римской системе счисления есть дополнительное правило, которое влияет на величину, которую обозначает цифра, в зависимости от ее положения.

Правило это запрещает употреблении одной и той же цифры более 3 раз подряд, поэтому три это III, а четыре это уже IV, и I(1), стоящая перед большей цифрой V(5), обозначает вычитание, то есть фактически равна -1.

Ниже два калькулятора — для перевода числа из диапазона 1 – 3999 в римское число и наоборот.
Для чисел больше 3999 используется несколько другая нотация.

Преобразование арабских чисел в РИМСКИЕ.

Иногда в таблице необходимо отобразить обычные арабские числа в римском написании. Например: когда вы провели расчеты (вычисления) арабскими числами. А отобразить их в приложении к договору или в бланке нужно в римских цифрах.

Для этого можно использовать функцию «РИМСКОЕ». Функция преобразует арабские цыфры в римские в текстовом формате.

Рассмотрим на примере:

  • Ставим курсор в ячейку
  • Запускаем мастер функций
  • Выбираем функцию «РИМСКОЕ»
  • В появившемся окне указываем число или ячейку, из которой будут обрабатывается данные.
  • НажимаемEnter.

Как перевести римские цифры на русские (арабские)?

Многие пользователи интернета очень часто так задают вопрос, когда нужно перевести какое-то римское число в арабское. Как это правильно делать — римское в арабское?

Здесь нужно знать полностью какой знак что именно означает. Если бы наяву, я бы вам подсказал, а так. просто нет римских чисел на буке, чтобы их изобразить. Как-то не очень давно я задался целью научиться преобразовывать римские числа в арабские, и это у меня получилось уже со второго раза. Поверьте, это очень даже легко. I-1, V-5, X-10, L-50 C-100, D-500, M-1000. А теперь представьте, что перед вами римское число MCMLXXXVI. Как вы думаете, что это за число? Расшифровываем. Первая М-1000, затем обращаем внимание, что следующее число состоит из нескольких знаков, как и все последующие: СМ-900, LXXX-80, VI-6. Складываем всё в кучу, получаем 1986. Нужно просто знать полную расшифровку римских чисел. I-1, II-2, III-3, IV-4, V-5, VI-6, VII-7, VIII-8, IX-9, X-10. Второй десяток прибавляем после 10-ти (Х) первый ряд. Затем начинается такая же цепочка из десятков: ХХ-20, ХХХ-30, XL-40, L-50, LX-60, LXX-70, LXXX-80, XC-90, C-100. Затем идут сотни СС-200, CCC-300, CD-400, D-500, DC-600, DCC-700, DCCC-800, CM-900, M-1000. Вот весь ряд до тысячи. С этим рядом риских чисел можно спокойно переводить даже очень большие римские числа в арабские, просто нужно быть внимательным.

конвертер Римские цифры в Арабские и наоборот

Язык Java /

Основы языка Java

21 апр 2011 22:10

У меня задание сделать конвертер Римские цифры в Арабские и наоборот. Написать в два класса. С Арабских цифр в РИсмкие у меня нормально конвертирует, а вот с РИмских цифр у меня с 4 и 9 проблема. Так как не могу прописать IV и IХ в case. Как же написать код, чтоб программа правильно распознавала 4 и 9. Когда я ввожу например: IX программа выдает 11. А так же когда IV выдает 6.
Спасибо.

Спасибо за помощь

22 апр 2011 00:15


Надо объявить в начале
static int last = 2000;
А потом, в convertRomanToInt, вместо integerValue += number;

All-Calc.com

Архивы

Конвертация из римских цифр в арабские

Онлайн инструмент для конвертации из римского числа в арабское.

Как пользоваться калькулятором

Введите в поле соответствующее поле стандартное число. После нажмите на красную кнопку «Конвертация». Программа автоматически конвертирует заданное число в соответствующую римскую цифру.

Примечание

Вводите римские цифры с помощью английской раскладки клавиатуры: I, V, X, S…

Теория

Стандартные числа — натуральные числа, которые возникают естественно при счете: 1, 2, 3…

Римские цифры использовались древними римлянами в их системе счисления.

Арабские цифры — название набора из десяти знаков: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

MaxSpT-Blog

Задание: Написать программу(-ы) для перевода из 10-й системы в римскую и обратно.

Специфика: Римская система счисления не является позиционной, то есть разобраться с переводом в один традиционный цикл не получится.

Первые идеи: Первое что мне пришло в голову, так это разобраться что есть римские цифры и какой у них диапазон. Римскими цифрами можно задать число от 1 до 3999 (I-MMMIM).

Справка по Римским цифрам была взята отсюда.Вот краткая таблица однозначного перевода:

quattuordecim
septendecim
duodeviginti
undeviginti
unus et viginti
quadraginta
quinquaginta
septuaginta
quadringenti
septingenti
octingenti

Идея алгоритма перевода из Римских в 10-е:


  1. Получать на вход строку (заведомо правильную)
  2. Считывать по одному(двум) элементу(-ам) и по соответствующему символу добавлять к переменной-сумме какое-либо число. Т.е. нашли I=>sum++, V=>sum=sum+5 и т.д.

Тут у меня возник логичный вопрос, а что делать, если строка заведомо не правильная. В рамках задачи это не рассматривается, но мы же не ищем легких путей.

Итак, слои проверки строки, которые покрывают большинство ошибок в выполнении программы:

  1. Проверить строку на корректность, т.е. проверить принадлежит ли каждый элемент строки одной из римских цифр.
  2. Проверить строку на повторяющиеся одиночные-тройные символы. Скажем, III=3, а вот IIII(по идее 4, но 4=IV)-такого числа в Римской системе счисления нет, так же как и VIIII (по идее 9, но 9=IX)
  3. Посимвольно проверить не стоит ли цифра с меньшим номиналом, перед старшей, исключением являются IV, IX, XV и подобные, полный список можно будет посмотреть ниже.

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

Идея алгоритма перевода из 10-х в Римские:

  1. Считать число
  2. Найти кол-во тысяч, добавить в выходную строку соответствующие символы.
  3. Найти кол-во сотен, добавить в выходную строку соответствующие символы.
  4. Найти кол-во десятков, добавить в выходную строку соответствующие символы.
  5. Найти кол-во единиц, добавить в выходную строку соответствующие символы.
  6. Учесть исключения, скажем 999=IM(исключение), а 998=CMXCVIII

-Почему именной такой порядок? Идти же можно в любом другом ?

Да, можно идти в любом другом, но зачем париться насчет порядка символов в строке после преобразования?

Чтобы не быть голословным, я представлю свой код программы на Pascal.

Большинство кода для выполнения задачи тут не нужно (Потому что он написан по принципу «Because i can») для вас будут интересны пункты (Ctrl+F) :

(тут всего 175 строчек, не печальтесь)
program RimToArab;
const M=7;

function getPriority(a: char):integer;
var p:integer;
begin
p:=0;
if (a =’M’)then p:=14;
if (a=’D’) then p:=11;
if (a=’C’) then p:=9;
if (a=’L’) then p:=7;
if (a=’X’) then p:=5;
if (a=’V’) then p:=3;
if (a=’I’) then p:=1;
getPriority:=p;
end;

function getPriority(a,b: char):integer;
var p:integer;
begin
p:=0;
if (a =’I’)and(b=’M’)then p:=13;
if (a =’C’)and(b=’M’)then p:=12;
if (a=’C’)and(b=’D’) then p:=10;
if (a=’X’)and(b=’C’) then p:=8;
if (a=’X’)and(b=’L’) then p:=6;
if (a=’I’)and(b=’X’) then p:=4;
if (a=’I’)and(b=’V’)then p:=2;
getPriority:=p;
end;

var k,g,i,des,sot,tic,err,t,prior,minPrior : integer; inpstr,outstr: string;
ErrorArray:array [1..M]of string;

ErrorArray[1]:=’VV’;ErrorArray[2]:=’IIII’;ErrorArray[3]:=’MMMM’;ErrorArray[4]:=’XXXX’;ErrorArray[5]:=’CCCC’;ErrorArray[6]:=’LL’;ErrorArray[7]:=’DD’;
err:=0;
k:=0;
i:=0;
g:=1;

writeln(‘Введите число 1-3999 или I-MMMIM(англ)’);
readln(inpstr);
val(inpstr,t,err);
if (err<>0)and(Length(inpstr)>0) then
begin
err:=0;
minPrior:=14;
prior:=getPriority(inpstr[1]);

for t:=1 to M do if (Pos(ErrorArray[t],inpstr)<>0) then err:=10;<Первичная проверка строки>
for t:=1 to Length(inpstr) do if not(inpstr[t] in [‘M’,’D’,’C’,’L’,’X’,’V’,’I’]) then begin writeln(‘Ошибка преобразования(0):*’,inpstr[t],’*’);err:=10;break;end;

t:=1;
while (t minPrior)then begin writeln(‘Ошибка преобразования(1):*’,inpstr[t],inpstr[t+1],’*’);err:=10;break;end;

if(prior minPrior)
then begin writeln(‘Ошибка преобразования(2):*’,inpstr[t],inpstr[t+1],’*’);err:=10;break;end;
t:=t+1;
end;

if (prior>0)and(minPrior>=getPriority(inpstr[t])) then minPrior:=getPriority(inpstr[t])
else if (prior =getPriority(inpstr[t-1],inpstr[t])) then minPrior:=getPriority(inpstr[t-1],inpstr[t]);
Inc(t);

if err<>0 then writeln(‘Римское число не корректно’)
else begin
while g =1) and (k 3999)) then begin writeln(‘Арабское число не корректно ‘, i); end <Основной алгоритм перевода Арабских цифр в Римские>
else begin

if i=3999 then begin outstr:=’MMMIM’;i:=0; end;
if i=2999 then begin outstr:=’MMIM’;i:=0; end;
if i=2999 then begin outstr:=’MIM’;i:=0; end;
if i=1999 then begin outstr:=’MIM’;i:=0; end;
if i= 999 then begin outstr:=’IM’;i:=0; end;

<Выдираем тысячи>
tic:=i div 1000;
if tic>0 then
begin
while tic<>0 do
begin
outstr:=outstr+’M’;
Dec(tic);
end;
if tic=0 then i:=i mod 1000;
end;

<Выдираем Сотни >
sot:=i div 100;
if sot>0
then begin
if sot=4 then begin sot:=0; outstr:= outstr+’CD’; end
else if sot=9 then begin sot:=0; outstr:= outstr+’CM’; end
else if ((sot>=5) and (sot 0 then while sot<>0 do
begin
outstr:=outstr+’C’;
Dec(sot);
end;
if sot=0 then i:=i mod 100;
end;

<Выдираем десятки>
des:=i div 10;
if des > 0
then
begin
if des=4 then begin des:=0; outstr:=outstr + ‘XL’; end
else if des=9 then begin outstr:=outstr+’XC’; des:=0; end
else if ((des>=5)and(des 0 then while des<>0 do
begin
outstr:=outstr+’X’;
Dec(des);
end;
if des=0 then i:=i mod 10;
end;

<Выдираем единицы>
if i>0 then
begin
if i=4 then begin outstr:=outstr+’IV’; i:=0; end
else if i=9 then begin outstr:=outstr+’IX’; i:=0; end
else if ((i>=5) and (i 0 then while i<>0 do
begin outstr:=outstr+’I’;
Dec(i);
end;
end;
end;
end;
if Length(outstr)<>0 then writeln(‘выходная строка: ‘,outstr);
readln();
END.

Илон Маск рекомендует:  PInt64 - Тип Delphi
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL