using System; using System.Linq; public class RomanNumeral { const int NaN = -1; private static int ToInteger(string roman_numeral) { string ro_num = roman_numeral.ToUpper().Trim(); char[] ro_num_array = ro_num.ToCharArray(); if (ro_num == "N") { return 0; } char[] symbols = { 'I', 'V', 'X', 'L', 'C', 'D', 'M' }; int [] values = { 1, 5, 10, 50, 100, 500, 1000 }; int int_num = 0; int symb_it = 0, symb_consec = 0; bool to_parse = true; int subtrahend = 0, didgit = -1; foreach (char ro_num_char in ro_num_array.Reverse()) { Console.WriteLine(ro_num_char); do { if (ro_num_char == symbols[symb_it]) { symb_consec += (symb_it%2==1)? 3:1; if (symb_consec > 3) { Console.WriteLine("symb_consec>3");return NaN; } didgit = symb_it/2*2+2; Console.WriteLine("Didgit: " + didgit); subtrahend = ((symb_it-1)/2)*2; int_num += values[symb_it]; to_parse = false; Console.WriteLine(values[symb_it]); } else if ((ro_num_char == symbols[subtrahend])) { if (didgit == symb_it) { return NaN; } didgit = symb_it; int_num -= values[subtrahend]; to_parse = false; //Console.WriteLine(over_six); } if (to_parse) { symb_it++; if (symb_it > 6) { Console.WriteLine("symb_it>6");return NaN; } symb_consec = 0; } } while (to_parse); to_parse = true; } return int_num; } public static void Main() { int test = RomanNumeral.ToInteger("MMCMXCIV"); Console.WriteLine(String.Format("{0:D0}",test)); } }