7

ローマ数字を整数に変換する方法を見つけようとしています。これは私のコードの一部です。ユーザーに 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;
            }
        }
    }
}
4

3 に答える 3

14

ローマ数字を変換する秘訣は、順方向ではなく逆方向 (文字列の末尾から) に作業することです。これにより、はるかに簡単になります。

例: IX をお持ちの場合

  • あなたはXで始まります, = 10
  • 1 戻る.... これで I、I は 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;
        }
    }

注: これはローマ数字を検証しません。既に有効なものを変換するだけです。

于 2013-07-17T23:04:14.153 に答える
0

基本的に、V が M の前にある場合はそれを減算するというロジックを追加する必要があります。ここのこの行に基づいて:

if (temp == 'V') {進行中 = 進行中 + 5;

于 2013-07-17T23:07:40.970 に答える