【问题标题】:Trouble with Integer to roman numeral class ( on Bluej)整数到罗马数字类的问题(在 Bluej 上)
【发布时间】:2014-11-20 18:29:20
【问题描述】:

这是我将整数转换为罗马数字和将罗马数字转换为整数的课程。当我将一个数字说 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;
    }
}

【问题讨论】:

    标签: bluej


    【解决方案1】:

    当我使用 romanToArabic 时,我得到了减去五的数字和缺少最后一个字母的罗马数字。

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

    1. 以 i = 0 开始 for 循环
    2. 从位置 0 == L 获取字符
    3. 加50
    4. 再次循环,i = 1
    5. 从位置 1 获取字符,即 X
    6. 加10
    7. 再次循环,i = 2
    8. 从位置 2 获取字符,即 X
    9. 加10
    10. 再次循环,i = 3
    11. 从位置 3 获取字符,即 X
    12. 加10
    13. 即将以 i = 4 开始循环
    14. LXXXV 长度为 5 个字符
    15. (LXXXV.length() - 1) = 4
    16. 循环测试 i&lt;roman.length()-1 现在正在测试 4 &lt; 4,但事实并非如此,它们是相等的。
    17. 所以不要循环,在这里完成,返回总和,它缺少最后的 5。

    它停止得太早,错过了最后一个罗马数字。

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

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

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

    (这种错误被称为逐一错误,在编写计数过早完成一个位置或超出一个位置的代码时非常容易)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      • 2023-01-17
      • 2015-07-24
      • 1970-01-01
      • 2023-01-10
      • 2017-11-27
      相关资源
      最近更新 更多