6

Dragon Book에는 구문 지향 변환 스키마를 사용하여 정수를 로마 숫자로 변환하는 연습이 포함되어 있습니다.구문 지향 변환 스키마를 사용하여 정수를 로마 숫자로 변환 하시겠습니까?

어떻게 완료 할 수 있습니까?

+1

은 숙제 문제처럼 보입니다. 숙제 문제와 같은 냄새가납니다.;-) –

+0

그래, 나도 알아 ... 내가 속임수가 아님을 증명할 수 있었으면 좋겠어. 그것은 CS 학생을위한 숙제 문제입니다 ... 저를 위해서가 아니라, 저 혼자서 책을 읽고 있습니다. 교사에게 물어볼 충분한 지식이없는 친구도 없습니다. –

답변

2

오른쪽에서 왼쪽으로 구문 분석하는 것이 좋습니다. (예 : 두 번째 우측 = 수십 열에서) 내가

0 -> '' 
1 -> 'X' 
2 -> 'XX' 
... 
9 -> 'XC' 
에 매핑하는 것을 사용하는 것이 두 번째 열이 있다면, 그런

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

:

첫째, 단위 열을 매핑 할 것

초기 출력 앞에 붙여야합니다.

문자가 부족할 때까지 다음 열 (수백, 수천) 동안 반복하십시오.

숫자가 '0'또는 음수가 아닌지 다시 확인하십시오.

+0

즉, sytanx-directed 변환 스키마를 사용하여 변환 할 수있는 컨텍스트없는 문법을 만들므로 각 "열"에 대해 10 개의 규칙을 만들어야합니다. (그래서, 약 34 규칙은 3999에 도달 할 수 있습니다.) 제가 맞습니까? –

+0

사실 이런 식으로 생각했습니다. 좀 더 우아한 방법이있을 거라 기대 했었습니다 ... 거기 있습니까? –

+0

예, 열당 10 개의 규칙을 의미합니다. 각 열에 대해 작동하는 단일 함수를 작성하고 매개 변수로 문자를 사용한다고 생각해보십시오 ... 따라서 219의 경우 f (2, 'C', 'D', 'M') + f (1 ''X ','L ','C ') + f (9,'I ','V ','X ') ' . – Oddthinking

2

다른 방법 등 1, 5, 10, 50, 100, 500, 1000을위한 2 차원 배열에 로마 숫자를 저장하는 것이다. 예제 (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"), 
); 

그런 다음 오른쪽에서 왼쪽으로 각 자릿수를 가져 와서 다음 번역을 적용하십시오. 변수 $으로 레벨 = 0로 설정되고 처리마다 숫자 뒤에 1 씩 값을 증가 ('.'PHP A의 두 스트링 concats)

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] 

예 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

다음은 1xxx 형식의 숫자에서 로마 숫자로 구문 지시 변환을 나타내는 문법입니다.

수 = OneThousand digit3 digit2 digit1 | nzdigit3 digit2 digit1 | nzdigit2 digit1 | nzdigit1

OneThousand -> 1 {인쇄 ('M')}

digit3 -> 0 digit3 -> nzdigit3

nzdigit3 -> 1 인쇄 ('C') nzdigit3 -> (2) (CCCC) nzdigit3 -> 5 print ('D') nzdigit3 -> 6 print ('DC') nzdigit3 -> 3 NWDIGIT3 -> 3 인쇄 ('CCC') nzdigit3 -> 4 인쇄 > 7 print ('DCC') nzdigit3 -> 8 print ('DCCC') nzdigit3 -> 9 print ('DCCCc')

마찬가지로 2 자리와 1 자리의 숫자에 대한 정의를 작성하면 번역이 필요합니다.

관련 문제