Roman Numeral to Integer

时间:2015-04-02 18:02:01

标签: java

我正在尝试找到最简单的算法来将罗马数字转换为int.I有来自Rosetta代码的代码,但代码中的一些东西没有意义。

在下面的代码中的for循环中,罗马数字是如何迭代的?可以解释嵌套for循环如何工作,或者你有一个更简单的方法来编写这个算法

public class Roman {

    enum Numeral {
        I(1), IV(4), V(5), IX(9), X(10), XL(40), L(50), XC(90), C(100), CD(400), D(500), CM(900), M(1000);
        int weight;

        Numeral(int weight) {
            this.weight = weight;
        }
    };

    public static String roman(long n) {

        if( n <= 0) {
            throw new IllegalArgumentException();
        }

        StringBuilder buf = new StringBuilder();

        final Numeral[] values = Numeral.values();
        for (int i = values.length - 1; i >= 0; i--) {
            while (n >= values[i].weight) {
                buf.append(values[i]);
                n -= values[i].weight;
            }
        }
        return buf.toString();
    }

    public static void test(long n) {
        System.out.println(n + " = " + roman(n));
    }

    public static void main(String[] args) {
        test(1999);
        test(25);
        test(944);
        test(0);
    }

2 个答案:

答案 0 :(得分:0)

罗马文字从最高到最低迭代。这很有道理。这是应该如何做到的,因为你想先提取最大的项目。一旦完成它,你想要提取第二大项目,依此类推。在提取项目时,它可能适合您当前剩余的数字0,1,2,3,...次。这就是这个循环的意义/目的。

        while (n >= values[i].weight) {
            buf.append(values[i]);
            n -= values[i].weight;
        }

我认为这是编写此算法的最简单方法。你只需要掌握这个想法。

答案 1 :(得分:0)

public int romanToInt(String s) {
        int total = 0, currentVal = 0, prevVal = 0;

        for(int i=s.length()-1; i>=0; i--) {
            switch(s.charAt(i)) {
                case 'I' : currentVal = 1; break;
                case 'V' : currentVal = 5; break;
                case 'X' : currentVal = 10; break;
                case 'L' : currentVal = 50; break; 
                case 'C' : currentVal = 100; break;
                case 'D' : currentVal = 500; break;
                case 'M' : currentVal = 1000; break; 
                default: break;
            }
            total += (currentVal < prevVal) ? -1 * currentVal : currentVal;
            prevVal = currentVal;
        }

        return total;
    }