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

标签 java decimal roman-numerals

我对计算机科学非常陌生,我知道我现在很可能会犯非常简单的错误。我正在编写一个程序将数字转换为罗马数字,但我的“上一个”变量不起作用。

编辑以澄清: 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;    
    }
}

最佳答案

这是更正后的代码:

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;

    }
}

您没有很好地估计上一个字符出现时的行为,您不仅想对先前添加的字符打折,而且还想对下一个字符的相同数字打折,因此需要打折两次。

关于java - 在Java中将十进制转换为罗马数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36682750/

相关文章:

html - 如何自定义有序列表中的数字?

java - "AWT-EventQueue-1"java.lang.OutOfMemoryError : Java heap space

Matlab - 在符号表达式中使用小数

十进制转二进制错误(C)

regex - 用于匹配多种类型编号列表的正则表达式

javascript - 如何创建正则表达式检查罗马数字?

java - 亚马逊认知 : Where do I get the initial token for the initiatiateAuth function?

java - 覆盖方法中的变量名称不正确

java - Android 4.0 将 POST 变成 GET

.net - 网络 5 : Decimal silently truncated - how to make it break?