2010-04-03 7 views
3

저는 재미있는 이유로 로마 숫자 변환기를 쓰고 있습니다. 문제는 앞에서 언급 한 문자 우선 순위까지 ​​작동합니다.문자열에서 문자 우선 순위를 지정해야합니다.

로마 숫자는 위치가 틀 렸습니다. 즉, III는 어떤 기본^2 + 1 *이든^1 + 1 *의 기본^0을 상징하지 않습니다.

누군가가 XIV를 타이핑하면 나는이 경우에 추가되지 않고 차라리 빼는 것이 필요합니다. 어떻게해야할지 모르겠습니다. 이 문제를 해결하기위한 최선의 방법은 무엇입니까?

const char cRomanArray[] = "IVXLCDM"; 
const int romanArray[] = { 1, 5, 10, 50, 100, 500, 1000 }; 

그래서 너무 힘들 날을 위해 단순히 내에서 우선 순위를 확인하여 망할 일을 무차별 않을 것이다 :

나는 모두를 배열에 저장되어있는 로마 기호 및 각각의 진수를 즉, 'I'가 'V'보다 작은 경우, 예를 들어 'XIV'와 같은 기호가 다음 기호보다 작 으면 배열로 정렬했기 때문에 기호가 작을 수 있습니다. add 대신 값을 뺍니다.

그러나 이것은 매우 못생긴 해결책처럼 보입니다. 아마 더 좋은 것들이 있을까요? 정규 표현식의 라인을 따라 무언가를 생각하고 있었을 것입니다. (끔찍한 생각처럼 들리면, 아직 RegExp를 사용하지 않았지만 그것이 필요한만큼 할 수있는 것처럼 들리지만, 그것은 문자열의 문자를 결정하는 것입니다. .)

답변

3

오른쪽에서부터 시작하십시오. 왼쪽으로 이동하고 값이 증가하는 동안 (또는 동일하게 유지되는 경우) 값을 더하고 감소 할 때 빼십시오.

V에서

시작 XLIV를 들어, 덜의 I 5.
이동을 추가, 그래서 그것이 더 큰의, 덜의 X에 50
이동을 추가 L 1.
이동을 빼기 때문에 10 빼기

그리고 44 점을 얻었습니다.


대안, 실제로 X와 I, II, III, IV 및 IX ... 10 ... (90) ... (9)를 교환 한 것을 제외하고,베이스 (10)로 취급 할 수 있으며, XX, XXX, LX .... XL, L 등등.

V 문자로 I &을 읽고이를 1-9로 변환 한 다음 X 문자 & 개를 읽고 10-90으로 변환하는 식으로 진행합니다.

+0

I & V를 읽고이를 1-9로 변환하면 IX에서 작동하지 않습니까? – Gauthier

+0

아, 네 말이 맞아. 패턴과 일치하지 않을 때까지 바로 읽을 수있을 것이라고 생각하지만, 첫 번째 제안은 코드 작성이 가장 쉽습니다. –

1

로마 숫자는 의미 상 위치가 정해지지 만, 각 위치는 십진수를 나타내는 복수 문자를 가질 수 있으며 십진수로 기호가 변경되고 자리 표시자를 사용하지 않으므로 0이됩니다. 따라서

따라서 사용할 룩업 테이블 :

// Decimal digit lookup tables 
static const char* thousands[] = { "", "M", "MM", "MMM" } ; 
static const char* hundreds[] = { "", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM" } ; 
static const char* tens[] = { "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC" } ; 
static const char* units[] = { "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" } ; 
static const char** digits[] = { thousands, hundreds, tens, units } ; 

이어서 각 십진수 오른쪽 (수천부터) 왼쪽위한 룩업 '숫자 [진폭] [진] 상기 룩업 테이블 및 출력에 부분 문자열을 추가하십시오. 0에 대한 로마 숫자가 없기 때문에 0은 단순히 생략됩니다.

예를 들어 1234는 "M"+ "CC"+ "XXX"+ "IV"= "MCCXXXIV"로 번역됩니다.

어떻게 작동하는지 이해하려면 Wikipedia: Roman Numerals - Symbols의 로마 숫자에 대한 설명을 참조하십시오. 구체적으로 말하자면 "기호"섹션의 마지막 표 (예 : 주제를 이해한다고 생각하는 경우에도 연구를 수행함)입니다. 3999보다 큰 숫자는 ASCII가 아닌 기호를 필요로하기 때문에 내 테이블은 1에서 3999로 제한되지만 유니 코드 솔루션으로 해결할 수도 있습니다.

취업 면접을 위해이 작업을 한 번했는데 위의 표를 기반으로 완전히 구현 된 작업이 있지만 재미로 작업을 수행 했으므로이 작업을 생략 했으므로 아마도 재미가 없을 것입니다. . 그러나 더 많은 포인터 나 힌트 또는 전체 솔루션을 원한다면 물어보십시오.

+0

나는 그가 로마 숫자를 쓰고 있다고 생각하지만, 다른 방법보다는 소수점 이하 자릿수를 사용한다.하지만 네가 그렇게하는 방법이다. –

+0

@Peter Alexander : Doh! 더 조심스럽게 게시물을 읽었어야합니다. 오 물론, 각 테이블에서이 테이블과 최대 부분 문자열 검색을 사용할 수 있습니다. 그러나 그것은 그가 피하고자하는 무차별적인 접근 일 수 있습니다. – Clifford

관련 문제