在Java中将十进制转换为罗马数字?

时间:2016-04-17 22:05:35

标签: java decimal roman-numerals

我是计算机科学的新手,我知道我现在最有可能犯很简单的错误。我正在制作一个程序,将数字转换为罗马数字,而我的'Previous'变量就不起作用了。

编辑以澄清: V(X,L,C,D,M,)之后的每个数字组合都在标记之上。此外,我的输出处理输入相同的前进和后退。例如:(IV = 6)

这是我的代码:

import java.util.*;

public class roman
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        System.out.print("Enter a Roman numeral: ");
        String R = in.nextLine();
        System.out.println("Converted to Decimal: " + RomanToDecimal(R));
    }

    static int RomanToDecimal(String R)
    {
        int Decimal = 0;
        char Previous;

        for (int x = 0; x < R.length(); x++)
        {
            Previous = R.charAt(x);
            if(R.charAt(x) == 'I')
                Decimal += 1;

            if(R.charAt(x) == 'V')
            {
                if (Previous == 'I')
                    Decimal -= 1;
                else
                    Decimal += 5;
            }

            if(R.charAt(x) == 'X')
            {
                if (Previous == 'I')
                    Decimal-= 1;
                else
                    Decimal+= 10;
            }

            if(R.charAt(x) == 'L')
            {
                if (Previous == 'X')
                    Decimal -= 10;
                else
                    Decimal+=50;
            }

            if(R.charAt(x) == 'C')
            {
                if (Previous == 'X')
                    Decimal -= 10;
                else
                    Decimal += 100;
            }

            if(R.charAt(x) == 'D')
            {
                if (Previous == 'C')
                    Decimal -= 100;
                else
                    Decimal += 500;
            }

            if(R.charAt(x) == 'M')
            {
                if (Previous == 'C')
                    Decimal -= 100;
                else
                    Decimal+= 1000;
            }

            Previous = R.charAt(x);
        }

        return Decimal;    
    }
}

2 个答案:

答案 0 :(得分:1)

这只是一个简单的逻辑错误。

如果我们使用IX的示例输入逐步执行您的代码,我们可以看到读入的第一个字符是I,这会导致Decimal的值增加1然后,当我们读入X时,我们从十进制中扣除1,使其为零。

这意味着程序输出0为输入IX

我们应该重新考虑这个程序是如何运行的。

答案 1 :(得分:1)

这是更正的代码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("Enter a Roman numeral: ");
        String R = in.nextLine();
        System.out.println("Converted to Decimal: " + RomanToDecimal(R));
    }

    static int RomanToDecimal(String R) {
        int Decimal = 0;
        char Previous = 0;

        for (int x = 0; x < R.length(); x++) {
            if (R.charAt(x) == 'I')
                Decimal += 1;

            if (R.charAt(x) == 'V') {
                System.out.println(Previous);
                if (Previous == 'I') {
                    Decimal -= 2;
                }
                Decimal += 5;
            }

            if (R.charAt(x) == 'X') {
                if (Previous == 'I') {
                    Decimal -= 2;
                }
                Decimal += 10;
            }

            if (R.charAt(x) == 'L') {
                if (Previous == 'X') {
                    Decimal -= 20;
                }
                Decimal += 50;
            }

            if (R.charAt(x) == 'C') {
                if (Previous == 'X') {
                    Decimal -= 20;
                }
                Decimal += 100;
            }

            if (R.charAt(x) == 'D') {
                if (Previous == 'C') {
                    Decimal -= 200;
                }
                Decimal += 500;
            }

            if (R.charAt(x) == 'M') {
                if (Previous == 'C') {
                    Decimal -= 200;
                }
                Decimal += 1000;
            }
            Previous = R.charAt(x);
        }
        return Decimal;

    }
}

当上一个字符出现时,你不能很好地计算行为,不仅你想要折扣之前添加的字符,而且你想要从下一个字符中折扣相同的数字,所以需要打折两次。