Преобразовать целые числа в римские цифры с помощью синтаксически-ориентированной схемы перевода? - PullRequest
8 голосов
/ 06 ноября 2008

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

Как это можно сделать?

Ответы [ 3 ]

2 голосов
/ 09 ноября 2008

Другой способ - сохранить в двумерном массиве римские цифры для 1, 5, 10, 50, 100, 500, 1000 и т. Д. Пример (в массиве PHP):

$roman = array(
  [0] = array( 1=>"I", 5=>"V", 10=>"X" ),
  [1] = array( 1=>"X", 5=>"L", 10=>"C" ),
  [2] = array( 1=>"C", 5=>"D", 10=>"M" ),
  [3] = array( 1=>"M", 5=>"^V", 10=>"^X" ),
);

Затем возьмите каждую цифру справа налево и примените следующий перевод. Установите переменную $ level = 0 и увеличивайте ее значение на 1 после каждой обработанной цифры:

1 => $roman[$level][1]
2 => $roman[$level][1].$roman[$level][1]
3 => $roman[$level][1].$roman[$level][1].$roman[$level][1]
4 => $roman[$level][1].$roman[$level][5]
5 => $roman[$level][5]
6 => $roman[$level][5].$roman[$level][1]
7 => $roman[$level][5].$roman[$level][1].$roman[$level][1]
8 => $roman[$level][5].$roman[$level][1].$roman[$level][1].$roman[$level][1]
9 => $roman[$level][1].$roman[$level][10]

(в PHP '.' Объединяет две строки)

Пример: 1945

5 => $roman[0][5] = "V"
4 => $roman[1][1].$roman[1][5] = "XL"
9 => $roman[2][1].$roman[2][10] = "CM"
1 => $roman[3][1] = "M"

Таким образом, переведенное число "MCMXLV"

Извините, это может не полностью ответить на ваш вопрос, но я надеюсь, что это поможет в любом случае ..

2 голосов
/ 22 октября 2011

Далее идет грамматика для представления синтаксически направленного перевода из числа в формате 1xxx в римские цифры.

число = тысяча цифра3 цифра2 цифра1 | nzdigit3 digit2 digit1 | nzdigit2 digit1 | nzdigit1

Тысяча -> 1 {print ('M')}

цифра3 -> 0 цифр3 -> nzdigit3

nzdigit3 -> 1 печать ('C') nzdigit3 -> 2 печати ('CC') nzdigit3 -> 3 print ('CCC') nzdigit3 -> 4 print ('CCCC') nzdigit3 -> 5 print ('D') nzdigit3 -> 6 print ('DC') nzdigit3 -> 7 print ('DCC') nzdigit3 -> 8 печать ('DCCC') nzdigit3 -> 9 печать ('DCCCc')

Аналогичным образом напишите определение цифр в позициях 2 и 1, и вам понадобится перевод.

2 голосов
/ 06 ноября 2008

Я бы рассмотрел разбор справа налево.

Во-первых, я бы отобразил столбец единиц:

0 -> ''
1 -> 'I'
2 -> 'II'
3 -> 'III'
4 -> 'IV'
...
9 -> 'IX'

Тогда, если бы был второй столбец (например, второй из столбца справа = десятки), я использовал бы это для отображения на

0 -> ''
1 -> 'X'
2 -> 'XX'
...
9 -> 'XC'

Это должно быть добавлено к начальному выводу.

Повторите для следующих столбцов (сотни, тысячи), пока не закончатся буквы.

Перепроверьте, не является ли номер 0 или отрицательным.

...