将罗马数字转换为整数值?

时间:2014-11-08 15:20:31

标签: java arrays

我是一名新编程学生,我的任务是将罗马数字的输入转换为它的整数值。这是我得到的:

编写一个程序,将一个罗马数字(如MCMLXXVIII)转换为十进制数字表示。这个程序必须有3个方法和一个主要方法!

  1. 编写一个从用户获取输入并将其传递给转换方法的方法。
  2. 编写一个方法,生成每个字母的数值(转换方法)。
  3. 编写一个方法,输出用户输入的数字和转换后的数字。
  4. 编写一个主要方法来测试3种方法。
  5. 提示:使用单维数组!

    转换字符串如下:

    •查看前两个字符。如果第一个值大于第二个值,则只需转换第一个值。

    •再次为第二个字符开头的子字符串调用转换方法。

    •添加两个值。 o如果第一个值的值小于第二个值,则计算差值并将尾部的转换添加到其中。

    现在我正在努力想弄清楚如何为我的转换方法做些什么。这是我到目前为止所写的内容:

        public static String romanInput(String number) {
    
        Scanner numberInput = new Scanner (System.in);
        System.out.print("Enter a roman numeral: ");
        String userInput = numberInput.next();
    
        return userInput;
    }
    
    public static int numberConversion(int number) {
    
        int romanConv = 0;
    
        char[] romanChar = {1, 5, 10, 50, 100, 500, 1000};
        for (int i = 0; i < romanChar.length; i++)
    
    }
    

    您可以看到我已经编写了从用户那里获取输入的方法。我想我做得对。但是,我不知道该怎么做这种转换方法。它说要使用单维数组,这就是我在这里所做的:

    char[] romanChar = {1, 5, 10, 50, 100, 500, 1000};
    

    那些应该是I,V,X,L,C,D和M的值。我真的很困惑,从那里去哪里,如果有人可以帮助我,我会很感激。

2 个答案:

答案 0 :(得分:1)

罗马计算是非位置的,这意味着数字的值不依赖于它们的位置,你可以忽略后者。然后添加所有数字的值就足够了。

无论如何都有一个例外:如果数字紧跟在较高值的数字之前,则减去而不是添加。

所以处理过程很简单:

  • 清除累加器。

  • 从左到右阅读数字。对于新的每个数字,将其转换为其值并将其添加到累加器。最后,累加器包含数值。

要处理异常,您可以使用以下技巧:

  • 使用包含前一个数字值的变量(最初设置为M的值);

  • 当前数字的值高于前一个数字时,您必须通过减去前一个数值的两倍来更正累加器。

编程:

( Initialize )
Prv= 1000
Acc= 0

Loop:
    ( Accumulate )
    Cur= Lookup(Digit[i])
    Acc+= Cur

    ( Adjust for inversions )
    if Prv < Cur -> Acc-= 2 * Prv
    Prv= Cur

例如,CXIX给出了

    Prv  Cur Acc
C   1000 100 100
X   100  10  110
I   10   1   111
X   1    10  121-2*1 = 119

答案 1 :(得分:0)

如果我是你,我会一步一步走一步。例如,如果我不得不担心的唯一输入是&#34;我&#34;那么什么?这当然是微不足道的。

接下来,如果输入是&#34; II&#34;,那么什么?这表明我需要一次处理输入一个字符。两个&#34; I&#34;每个都等于一个,结果是两者的总和。这意味着,我必须得到一个&#34;结果&#34;或者一些这样的变量,初始化为零,然后对于输入字符串中的每个字符(I,然后是I),将其转换为数字值(1,然后是1),将它们相加并返回值。

这种逻辑适用于&#34; III&#34;还

然后你面对你的第一次挑战&#34; IV&#34;。这不是微不足道的,特别是如果你是这种算法的新手。让我把它放在一边,注意这很难,所以稍后会解决这个问题。

值&#34; V&#34;,&#34; VI&#34;,&#34; VII&#34;,&#34; VIII&#34;所有这些都与上述逻辑一致。

但是我会再次陷入&#34; IX&#34;。类似于&#34; IV&#34;以上。也许我现在已经对这两个有了一个想法,但是,也许我现在仍然会将这两个放在一边。

这适用于&#34; X&#34;,&#34; XI&#34;,&#34; XII&#34;,&#34; XIII&#34;,然后再次问题&# 34; XIV&#34;

我会抵制解决&#34; IV&#34;,&#34; IX&#34;,&#34; XIV&#34;这样你就可以自己试试;记住这些都是非平凡的,至少与我上面所写的相比。尝试一下。

所以你看,增量添加效果很好,但减少是一个尚未解决的问题。

希望这有帮助。