Integer到罗马数字类的麻烦(在Bluej上)

时间:2014-11-20 18:29:21

标签: bluej

这是我的类,用于将整数转换为罗马数字,将罗马数字转换为整数。当我把一个数字,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;
    }
}

1 个答案:

答案 0 :(得分:0)

  

当我使用romanToArabic时,我将数字减去5,罗马数字丢失了最后一个字母。

85作为罗马数字是LXXXV - 将其放入romanToArabic()函数中,这种情况发生了:

  1. 使用i = 0
  2. 启动for循环
  3. 从位置0获取角色== L
  4. 添加50
  5. 再次循环,i = 1
  6. 从位置1获取字符,即X
  7. 添加10
  8. 再次循环,i = 2
  9. 从位置2获取字符,即X
  10. 添加10
  11. 再次循环,i = 3
  12. 从位置3获取角色,即X
  13. 添加10
  14. 即将以i = 4
  15. 开始循环
  16. LXXXV长5个字符
  17. (LXXXV.length() - 1)= 4
  18. 循环测试i<roman.length()-1现在正在测试4 < 4并且这不正确,它们是相同的。
  19. 所以不要循环,在这里完成,返回总和,这是从最后错过5。
  20. 它太早停止并错过了最后一个罗马数字。

    你将不得不再循环一次,然后重新考虑这一点:

    case 'V':
        next = roman.charAt(i+1);
    

    因为当主循环到达最后一个位置时,这些行将尝试查看字符串末尾的一个位置,并导致错误消息。相反,你可以用安全检查来编写它们:&#34;如果我们不在最后一个位置,在位置i + 1获取char,否则跳过该位并单独处理这个角色&#34 ;

    (这种错误被称为一个错误,并且在编写通过事物过早完成一个地方或一个地方超限的代码时非常容易)。