什麼意思是正確的Roman numeralsmayvary。爲簡單起見(沒有Unicode,沒有乘法原理,沒有雙subtractives,沒有overbars,沒有大的號碼等)對這一問題的原因,有效的羅馬數字由the regex定義:如何將羅馬數字轉換爲整數,同時使用標準C拒絕無效數字?
^(M{0,3})(D?C{0,3}|CM|CD)(L?X{0,3}|XC|XL)(V?I{0,3}|IX|IV)$
Code example with POSIX regexec()
。正則表達式使用「嚴格」規則表示的1..3999範圍內的羅馬數字匹配。
解決方法有很多,可以轉換的羅馬數字,如果我們不需要拒絕無效數字,例如:
int roman_numeral_value(unsigned char c)
{
switch(toupper(c)) {
case 'I': return 1;
case 'V': return 5;
case 'X': return 10;
case 'L': return 50;
case 'C': return 100;
case 'D': return 500;
case 'M': return 1000;
default: return 0; // error
}
}
int roman_numeral_to_int(const char *s, int size)
{
int total = 0, prev = 0;
for (int i = size-1; i >= 0; --i) { // in reverse order
int value = roman_numeral_value(s[i]);
total += value < prev ? -value : value; // subtract if necessary
prev = value;
}
return total;
}
It works for valid Roman numerals。但roman_numeral_to_int()
接受由正則表達式拒絕的數字,如IIIII
。是否有一個類似的簡單跨平臺解決方案,不需要pcre_exec()
或其他外部依賴項可用於有效的羅馬數字,僅適用於?
也許是一個單獨的計數,例如'int total ... n = 0; for(...){int value ...; if(n <3 &&(value == 1000 || ...){total ...; n ++;} else n = 0; ...}'。一種非常(粗糙)但是蠻力的方法嗎?你想要如何處理它的限制? –
你想讓我們在純C中實現DFA嗎? –
我見過的唯一一個有28個條件檢查,例如'if(100)..「C」.. else if(200 )「CC」.. else if(700)..「DCC」等等。 –