我试图弄清楚如何将罗马数字转换为整数.这是我代码的一部分.当我提示用户输入M时它显示1000,但是当我提示用户输入罗马数字(如VM)时,它不会给我995而是1005.这是因为我告诉我的程序这样做.
我想弄清楚的是我如何向前看并让它知道何时添加或减去罗马数字.
我该如何开始这样做?
class Roman { public int inprogress = 0; public Roman(string roman) { char temp = 'Z'; int length; length = roman.Length; for (int i = 0; i < length; i++) { temp = roman[i]; if (temp == 'M') { inprogress = inprogress + 1000; } if (temp == 'D') { inprogress = inprogress + 500; } if (temp == 'C') { inprogress = inprogress + 100; } if (temp == 'L') { inprogress = inprogress + 50; } if (temp == 'X') { inprogress = inprogress + 10; } if (temp == 'V') { inprogress = inprogress + 5; } if (temp == 'I') { inprogress = inprogress + 1; } } } }
解决方法
转换罗马数字的技巧是向后工作(从字符串的末尾开始)而不是向前工作,使其变得更容易.
例如,如果你有IX
>你从X开始,= 10
>向后移动1 ….现在它是我,我小于X所以现在减去1 = 9
参考解决方案….
public class RomanNumeral { public static int ToInt(string s) { var last = 0; return s.Reverse().Select(NumeralValue).Sum(v => { var r = (v >= last)? v : -v; last = v; return r; }); } private static int NumeralValue(char c) { switch (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; } return 0; } }
注意:这不会验证罗马数字,只是转换已经有效的数字.