这是我的类,用于将整数转换为罗马数字,将罗马数字转换为整数。当我把一个数字,85,放入arabicToRoman时,我得到了正确的罗马数字,但我得到的整数总是少于5,所以85得到80.当我使用romanToArabic时,我得到的数字减去5并且罗马数字遗漏了最后一个字母。能帮我找到问题的根源吗?一切都贴在下面(我在初中高中,温柔)
public class RomanNumeral
{
private int arabic;
private String roman;
public RomanNumeral(String r)
{
roman = r.toUpperCase();
arabic = romanToArabic();
}
public RomanNumeral(int a)
{
arabic = a;
roman = arabicToRoman();
}
public int romanToArabic()
{
int sum = 0;
int i;
for(i=0; i<roman.length()-1; i++)
{
char rom = roman.charAt(i);
switch(rom)
{
case 'M':
sum += 1000;
break;
case 'D':
sum += 500;
break;
case 'C':
char next = roman.charAt(i+1);
if(next == 'M')
{
sum += 900;
i++;
}
if( next == 'D')
{
sum += 400;
i++;
}
else
{
sum += 100;
}
break;
case 'L':
sum += 50;
break;
case 'X':
next = roman.charAt(i+1);
if(next == 'L')
{
sum += 40;
i++;
}
if(next == 'C')
{
sum += 90;
i++;
}
else
{
sum += 10;
}
break;
case 'V':
next = roman.charAt(i+1);
if(next == 'I')
{
sum += 6;
i++;
}
else
{
sum += 5;
}
break;
case 'I':
next = roman.charAt(i+1);
if(next == 'V')
{
sum += 4;
i++;
}
if(next == 'X')
{
sum += 9;
i++;
}
else
{
sum += 1;
}
break;
default:
System.out.println("I've encountered an issue with the characters you've entered.");
}
}
return sum;
}
public String arabicToRoman()
{
int temp = arabic;
String hud = "";
while(temp >= 1000)
{
hud += "M";
temp -= 1000;
}
while(temp >= 900)
{
hud += "CM";
temp -= 900;
}
while( temp >= 500)
{
hud += "D";
temp -= 500;
}
while( temp >= 400)
{
hud += "CD";
temp -= 400;
}
while(temp >= 100)
{
hud += "C";
temp -= 100;
}
while(temp>= 90)
{
hud += "XC";
temp -= 90;
}
while(temp >= 50)
{
hud += "L";
temp -= 50;
}
while( temp >= 40)
{
hud += "XL";
temp -= 40;
}
while (temp >= 10)
{
hud += "X";
temp -= 10;
}
while( temp >= 9)
{
hud += "IX";
temp -= 9;
}
while(temp >= 6)
{
hud += "VI";
temp -= 6;
}
while (temp >= 5)
{
hud += "V";
temp -= 5;
}
while (temp >= 4)
{
hud += "IV";
temp -= 4;
}
while (temp >= 1)
{
hud += "I";
temp -= 1;
}
return hud;
}
public String toString()
{
String hud = arabicToRoman();
int sum = romanToArabic();
return "The roman numeral equivalent of the number " + sum + " " + "is " + hud;
}
}
答案 0 :(得分:0)
当我使用romanToArabic时,我将数字减去5,罗马数字丢失了最后一个字母。
85作为罗马数字是LXXXV - 将其放入romanToArabic()
函数中,这种情况发生了:
for
循环
i<roman.length()-1
现在正在测试4 < 4
并且这不正确,它们是相同的。它太早停止并错过了最后一个罗马数字。
你将不得不再循环一次,然后重新考虑这一点:
case 'V':
next = roman.charAt(i+1);
因为当主循环到达最后一个位置时,这些行将尝试查看字符串末尾的一个位置,并导致错误消息。相反,你可以用安全检查来编写它们:&#34;如果我们不在最后一个位置,在位置i + 1获取char,否则跳过该位并单独处理这个角色&#34 ;
(这种错误被称为一个错误,并且在编写通过事物过早完成一个地方或一个地方超限的代码时非常容易)。