加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 我试图弄清楚如何将罗马数字转换成整数

发布时间:2020-12-15 18:14:00 所属栏目:百科 来源:网络整理
导读:我试图弄清楚如何将罗马数字转换为整数.这是我代码的一部分.当我提示用户输入M时它显示1000,但是当我提示用户输入罗马数字(如VM)时,它不会给我995而是1005.这是因为我告诉我的程序这样做. 我想弄清楚的是我如何向前看并让它知道何时添加或减去罗马数字. 我该
我试图弄清楚如何将罗马数字转换为整数.这是我代码的一部分.当我提示用户输入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;
        }
    }

注意:这不会验证罗马数字,只是转换已经有效的数字.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读