当前位置: 首页 > 知识库问答 >
问题:

Java-转换罗马数字

许永年
2023-03-14

我正在尝试将罗马数字转换为阿拉伯数字。我取一个字符串并运行一个循环来检查每个字符的值。所以'M'将返回1000等。在罗马数字中,如果一个数字小于下一个,那么您需要减去它。所以'XL'或'10 50'将是40。这就是为什么我在for循环中有一个if语句,我在其中检查下一个字符并返回其值。稍后我将进行算术运算,但现在我只是尝试返回值。

我的问题是,它总是返回最后一个字符值两次。不管我输入2个字符还是10个字符。if语句显然是在检查长度-1,所以它应该在到达最后一个字符时结束检查。我试着调试它,但在最后一轮调试结束时,一切看起来都很好,出于某种原因,程序会打印最后一个值两次。你能找出我做错了什么吗?

我可以看到以前有人问过关于罗马数字的问题,但我之前没有在这里讨论过这个问题。

public class RomanNumerals{
    static int value(char a) {
        if (a=='m') return 1000;
        else if (a=='d') return 500;
        else if (a=='c') return 100;
        else if (a=='l') return 50;
        else if (a=='x') return 10;
        else if (a=='v') return 5;
        else if (a=='i') return 1;
        else return 0;
    }

    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        System.out.print("Enter Roman numerals: ");
        String roman=in.nextLine();
        roman=roman.toLowerCase();
        int val=0;
        int val_next=0;

        for (int i=0;i<roman.length();i++) {
            val=value(roman.charAt(i));
            if (i<roman.length()-1) {
                val_next=value(roman.charAt(i+1));
            }
            System.out.println(val + "\t" + val_next);
        }
    }
}

输出:

Enter Roman numerals: MCD
1000    100
100     500
500     500
BUILD SUCCESSFUL (total time: 6 seconds)

Enter Roman numerals: LXMDC
50       10
10       1000
1000     500
500      100
100      100
BUILD SUCCESSFUL (total time: 6 seconds)
package hello.world;

import java.util.Scanner;

public class HelloWorld {
    static int value(char a) {
        if (a=='m') return 1000;
        else if (a=='d') return 500;
        else if (a=='c') return 100;
        else if (a=='l') return 50;
        else if (a=='x') return 10;
        else if (a=='v') return 5;
        else if (a=='i') return 1;
        else return 0;
    }

    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        System.out.print("Enter Roman numerals: ");
        String roman=in.nextLine();
        roman=roman.toLowerCase();
        int val=0;
        int val_next=0;
        int temp=0;
        int result=0;

        for (int i=0;i<roman.length();i++) {
            val=value(roman.charAt(i));
            if (i<roman.length()-1) {
                val_next=value(roman.charAt(i+1));
            } else val_next=0;

            if (val_next==0) {
                temp=val;
            } else {
                if (val>val_next) temp=val;
                else if (val<val_next) {
                    temp=val_next-val;
                    i++;
                } else if (val==val_next) temp=val;
            }            
            result+=temp;
        }
        System.out.println("Result is: " + result);
    }
}

输出:

Enter Roman numerals: MMMCDXLIX
Result is: 3449
BUILD SUCCESSFUL (total time: 10 seconds)

Enter Roman numerals: MMXIV
Result is: 2014
BUILD SUCCESSFUL (total time: 2 seconds)

共有2个答案

翁良弼
2023-03-14

您正在重新检查元素。因此,根据编写for循环的方式,必须在循环内再次递增或递减。

class Solution {
 public int romanToInt(String s) {
    int x=0;
    for(int i=s.length()-1;i>=0;i--){
        if(i!=0&& returnNumber(s.charAt(i))>returnNumber(s.charAt(i-1))){
            x=x+returnNumber(s.charAt(i))-returnNumber(s.charAt(i-1));
            i--;
        }
        else{
            x=x+returnNumber(s.charAt(i));
        }
    } return x;

}
public int returnNumber(char s){
    switch(s){
        case 'I': return 1;

        case 'V': return 5;

        case 'X': return 10;

        case 'L': return 50;

        case 'C': return 100;

        case 'D': return 500;

        case 'M': return 1000;

    }
    return 0;
}
}
令狐嘉禧
2023-03-14

这是你的问题:

    for (int i=0;i<roman.length();i++) {
        val=value(roman.charAt(i));
        if (i<roman.length()-1) {
            val_next=value(roman.charAt(i+1)); //<--
        }
        System.out.println(val + "\t" + val_next);
    }

在这一行中,设置val_next。对于上一次迭代,它会保留上一个值的迭代,因为它会绕过if循环,所以它会保留500来自MCD,因为它在C的迭代中被设置为500

    for (int i=0;i<roman.length();i++) {
        val=value(roman.charAt(i));
        if (i<roman.length()-1) {
            val_next=value(roman.charAt(i+1)); //<--
        }
        System.out.println(val + "\t" + val_next);
    }

我想你需要把它重置为0来计算。

    for (int i = 0; i < roman.length(); i++) {
        val = value(roman.charAt(i));
        if (i < roman.length() - 1) {
            val_next = value(roman.charAt(i + 1));
        } else {
            val_next = 0;
        }
        System.out.println(val + "\t" + val_next);
    }

输出变成:

Enter Roman numerals: MCD
1000    100
100     500
500     0

既然你说现在只需要这些值,我就把实际的算术留给你:D

 类似资料:
  • 问题内容: 我需要使用一种方法将整数转换为罗马数字。后来,我必须使用该程序以罗马数字写出1到3999,这样就可以进行硬编码了。我下面的代码非常简单;它是一个基本的I / O循环,可以在使用getIntegerFromUser我们在课堂上制作的程序包时退出。 当我调用该方法时,是否可以将值赋给字符串,然后将它们添加在一起? 更新:我从教授那里得到了一些伪代码来帮助我,而在我理解他要说的内容的同时,我

  • 问题内容: 这是user2486所说的之后的当前代码。 我在使用ns时遇到此错误:UnboundLocalError:分配前引用了本地变量’ns’ 问题答案: 考虑一下此附加的伪代码和提示(其中一些是有效的Python,一些不是有效的,但有注释)。

  • 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 100

  • 罗马数字包含以下七种字符:I,V,X,L,C,D和M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做II,即为两个并列的 1。12 写做XII,

  • 013. Roman to Integer 问题 Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. Subscribe to see which companies asked this question 思路 首先要知道罗马数字的规