我是一名新编程学生,我的任务是将罗马数字的输入转换为它的整数值。这是我得到的:
编写一个程序,将一个罗马数字(如MCMLXXVIII)转换为十进制数字表示。这个程序必须有3个方法和一个主要方法!
提示:使用单维数组!
转换字符串如下:
•查看前两个字符。如果第一个值大于第二个值,则只需转换第一个值。
•再次为第二个字符开头的子字符串调用转换方法。
•添加两个值。 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的值。我真的很困惑,从那里去哪里,如果有人可以帮助我,我会很感激。
答案 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;这样你就可以自己试试;记住这些都是非平凡的,至少与我上面所写的相比。尝试一下。
所以你看,增量添加效果很好,但减少是一个尚未解决的问题。
希望这有帮助。