我目前正在编写一个罗马数字转换器以获得乐趣。该问题适用于上述字符优先级。
由于罗马数字不是位置,即 III 不象征 1*任何基数^2 + 1*任何基数^1 + 1*任何基数^0。
当有人输入 XIV 时,这当然会变得很困难,我需要确保在这种情况下没有添加 I,而是减去。我不知道该怎么做。解决这个问题的最佳方法是什么?
我将罗马符号及其各自的十进制数存储在数组中:
const char cRomanArray[] = "IVXLCDM";
const int romanArray[] = { 1, 5, 10, 50, 100, 500, 1000 };
因此,通过简单地检查数组中的优先级,即如果符号小于下一个符号,即在示例 'XIV' 中,如果 'I' 更小,我就不会太难强行该死的东西比'V',在这种情况下,是因为我已经在数组中对它们进行了排序,然后我可以让它减去值而不是添加值。
但这似乎是一个非常丑陋的解决方案。也许有更好的?我可能正在考虑正则表达式的一些东西(如果这听起来很糟糕,请原谅我,我还没有使用过 RegExp,但听起来它可以做我需要的,那就是确定字符串中的字符.)
最佳答案
从右边开始。向左移动,只要值增加(或保持不变)就将它们相加,并在它们减少时减去。
例如四十四岁
从 V 开始,加 5。
移到 I,它更少,所以减 1。
移动到 L,它更大,加 50。
移到 X,它变小了,所以减去 10。
你得到 44,这是正确的。
或者,您实际上可以将其视为基数 10,除了将 1...9 与 I、II、III、IV... IX 和 10...90 与 X、XX、XXX、LX....XL 交换, L 等。
读入 I&V 字符,将它们转换为 1-9,然后读入 X&L 字符,将它们转换为 10-90,依此类推。
关于c++ - 需要格式化字符串中的字符优先级,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2570640/