【问题标题】:Validation of Roman Numerals! (Java)罗马数字的验证! (爪哇)
【发布时间】:2021-03-11 17:52:52
【问题描述】:

我编写了一个 Java 程序来将罗马数字转换为数字。我唯一的问题是,如果有人输入"IIII",它会显示为 4,但它应该给出一个错误,即它不是有效的罗马数字。我需要在我的代码中包含以下规则。有人可以帮我解决这个问题吗?

(1)没有一个数字连续重复超过三次,即I、X、C不能重复超过3次。

(2) 数字 V、L 和 D 不重复。 V、L、D的重复在数字的构成中是无效的。

【问题讨论】:

  • 扮演魔鬼代言人:iiii 实际上是 4 的正确罗马数字。monochrome-watches.com/…
  • 当然,但另一个例子是“VVVV”这不是罗马数字,或者有人输入“VV”而不是“X”
  • 友情提示:StackOverflow 的语言是英文,使用非英文的方法或变量名会使代码难以阅读和理解。
  • 感谢您的善意。下次考虑在您的实际代码示例中执行搜索+替换。谢谢。
  • 所以x.indexOf("IIII") 必须小于0,对吧?你能做剩下的吗?

标签: java eclipse roman-numerals


【解决方案1】:

罗马数字到十进制数字的转换:

public class RomanNumberUtils {
        static String romanNumeral;
        static int decimalNum;
        public static void main(String args[]) {
                RomanNumberUtils roman = new RomanNumberUtils();
                roman .convertRomanToDecimal();
                roman .printRoman(romanNumeral);
        }
 
        public void convertRomanToDecimal () {
                Scanner scan = new Scanner(System.in);
                System.out.print("Enter a Roman number: ");
                romanNumeral = scan.nextLine();
                romanNumeral = romanNumeral.toUpperCase();
                
                int l=  romanNumeral.length();
                int num=0;
                int previousnum = 0;
                for (int i=l-1;i>=0;i--)
                { 
                        char x =  romanNumeral.charAt(i);
                        x = Character.toUpperCase(x);
                        switch(x)
                        {  
                                case 'I':
                                previousnum = num;
                                num = 1;
                                break;
                             case 'V':
                                     previousnum = num;
                                num = 5;
                                break;
                                case 'X':
                                        previousnum = num;
                                num = 10;
                                break;
                                case 'L':
                                        previousnum = num;
                                num = 50;
                                break;
                                case 'C':
                                        previousnum = num;
                                num = 100;
                                break;
                                case 'D':
                                        previousnum = num;
                                num = 500;
                                break;
                                case 'M':
                                        previousnum = num;
                                num = 1000;
                                break;
                        }           
                        if (num<previousnum)
                        {decimalNum= decimalNum-num;}
                         else
                        decimalNum= decimalNum+num;
                }
        }
        public static void printRoman (String romanNumeral){
                System.out.println ("The equivalent of the Roman numeral "+romanNumeral+" is "+decimalNum);
        }
}

【讨论】:

  • A pre-validation 需要验证罗马文本(字符),这意味着任何罗马数字不应连续包含超过 3 次的任何字符(罗马字符:I, V, X,L,C,D,M)
  • 你好,这么多横向空间唯一的问题是代码很快就跑出窗口了
【解决方案2】:

这是我的罗马数字到十进制数字转换器的版本。

这是我的许多测试之一的测试结果。

Enter a Roman numeral: ccccllllxxxxvvvviiii
The input Roman numeral CCCCLLLLXXXXVVVVIIII is invalid.
The correct Roman numeral is DCLXIV.
The decimal value is 664.
Enter a Roman numeral: mcmlxxii
The input Roman numeral MCMLXXII is valid.
The decimal value is 1972.
Enter a Roman numeral: mmmccclll
The input Roman numeral MMMCCCLLL is invalid.
The correct Roman numeral is MMMCDL.
The decimal value is 3450.
Enter a Roman numeral: mcmlxxio
The input Roman numeral MCMLXXIO contains invalid characters.
Enter a Roman numeral: lcl
The input Roman numeral LCL is invalid.
The correct Roman numeral is CC.
The decimal value is 200.
Enter a Roman numeral: quit

基本上,我将输入的罗马数字转换为十进制数字。然后我将十进制数字转换回罗马数字。我比较了罗马数字,并输出了正确的罗马数字和十进制值。

这是完整的可运行代码。

import java.util.Scanner;

public class RomanNumeralConversion {

    public static void main(String[] args) {
        RomanNumeralConversion rnc = new RomanNumeralConversion();
        rnc.processRomanNumerals();
    }
    
    private Object[][] conversion = { { 1000, 900, 500, 400, 100, 90, 
            50, 40, 10, 9, 5, 4, 1 },
            { "M", "CM", "D", "CD", "C", "XC", "L", "XL", 
            "X", "IX", "V", "IV", "I" } };
    
    public void processRomanNumerals() {
        Scanner scanner = new Scanner(System.in);
        String inputRomanNumeral = readRomanNumeral(scanner);
        
        while (!inputRomanNumeral.equals("QUIT")) {
            int value = convertToDecimal(inputRomanNumeral);
            if (value < 0) {
                System.out.println("The input Roman numeral " + 
                        inputRomanNumeral + " contains invalid characters.");
            } else {
                String calculatedRomanNumeral = convertToRoman(value);
                
                if (inputRomanNumeral.equals(calculatedRomanNumeral)) {
                    System.out.println("The input Roman numeral " + 
                            inputRomanNumeral + " is valid.");
                } else {
                    System.out.println("The input Roman numeral " + 
                            inputRomanNumeral + " is invalid.");
                    System.out.println("The correct Roman numeral is " + 
                            calculatedRomanNumeral + ".");
                }
                System.out.println("The decimal value is " + value + ".");
            }
            inputRomanNumeral = readRomanNumeral(scanner);
        }
        
        scanner.close();
    }

    private String readRomanNumeral(Scanner scanner) {
        System.out.print("Enter a Roman numeral: ");
        return scanner.nextLine().trim().toUpperCase();
    }
    
    private int convertToDecimal(String input) {
        int output = 0;
        int index = 0;
        
        while (index < input.length()) {
            boolean isInvalid = true;
            for (int i = 0; i < conversion[1].length; i++) {
                String test = (String) conversion[1][i];
                int j = index + test.length();
                if ((j <= input.length()) && 
                        (input.substring(index, j).equals(test))) {
                    output += (Integer) conversion[0][i];
                    index = j;
                    isInvalid = false;
                    break;
                }
            }
            
            if (isInvalid) {
                return -1;
            }
        }
        
        return output;
    }
    
    private String convertToRoman(int input) {
        String output = "";
        
        for (int i = 0; i < conversion[0].length; i++) {
            int value = (Integer) conversion[0][i];
            if (input >= value) {
                output += (String) conversion[1][i];
                input -= value;
                i--;
            }
        }
    
        return output;
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多