我的转换方法都错了,我不知道如何解决它

时间:2014-11-09 18:35:27

标签: java algorithm

这边的新编程学生。试图将罗马数字输入转换为它的整数值。我一直在这里使用this帖子作为指南。这是事情,我还没有学习哈希表或枚举,所以我不能在我的代码中使用它。让我告诉你到目前为止我所拥有的:

    public static String romanInput(int number) {

    Scanner numberInput = new Scanner (System.in);
    System.out.print("Enter a roman numeral in uppercase: ");
    String userInput = numberInput.next();

    return userInput;
}

public static int numberConversion(String romanNumeral) {

    int result = 0;

    for (int x = romanNumeral.length() - 1; x >= 0 ; x--) {
        char romanConvert = romanNumeral.charAt(x);

        switch (romanConvert) {
            case 'I':
                result += 1;
                break;
            case 'V':
                result += 5;
                break;
            case 'X':
                result += 10;
                break;
            case 'L':
                result += 50;
            case 'C':
                result += 100;
                break;
            case 'D':
                result += 500;
                break;
            case 'M':
                result += 1000;
                break;
        }
    }
    return result;
}

public static int numberOutputs(String input, int converted) {

    String input = romanInput(output);
    int 
}



public static void main(String[] args) {



}

}

我甚至没有达到可以测试它的程度,但我知道我在做什么是错的。我知道如果输入的罗马数字是递减值或等值,那么您将把这些值加在一起。我知道如果数字小于它后面的数字,你就会减去它的值。所以我猜这个算法会是这样的:

if (first number >= second number) {
    return (first number + second number)
} else {
    return (second number - first number) };

这是我的转换算法应该是什么样的?

让我告诉你一些关于我的任务陈述的更多细节: 这个程序必须有3个方法和一个主要方法!

  1. 编写一个从用户获取输入并将其传递给转换方法的方法。
  2. 编写一个方法,生成每个字母的数值(转换方法)。
  3. 编写一个方法,输出用户输入的数字和转换后的数字。
  4. 写一个主要方法来测试3种方法 提示:使用单维数组!
  5. 因此,一旦我弄清楚如何编写算法,我就需要构建一个输出用户输入的数字和转换后的数字的方法。这会是这样的:

    System.out.println("The number you entered was: " +romanInput(input));
    

    然后对转换后的罗马数字执行相同的操作。我应该以该方法回归什么?

    我不想仅仅复制其他帖子上的内容,因为我正在尝试理解该程序应该如何工作。这是一个在线课程,所以不幸的是我只有一本书作为这项任务的指南,所以我非常感谢更有经验的程序员的帮助。

4 个答案:

答案 0 :(得分:1)

这显然不是您问题的完整解决方案,但这是一种通用算法。

  1. 考虑创建一个地图来保存键(罗马数字)和值(阿拉伯数字)。
  2. 从左到右解析罗马数字。
  3. 对于每个罗马数字数字,请检查右侧的罗马数字数字。
  4. 如果它更小,你就完成了(手拿罗马数字的阿拉伯数字值并将其添加到结果中)。
  5. 如果它相等或更大,请检查右侧的罗马数字数字。
  6. 重复4和5直到结束。
  7. 我确定我错过了一些东西,但这应该给你一个很好的起点。

    有人会想到一个破坏这个算法的负面测试吗?

    <强>更新

    正如我对此的想法更多,对于快速面试消除轮次而言,这似乎是一个非常好的紧凑问题。候选人应该能够在5分钟内编写伪代码,并在20分钟内编写工作程序。所以,我以为我会创建一个参考实现。所以,如果你想在网上试一试,那就是My Roman to Arabic Converter

    这是它的来源。感兴趣的逻辑是靠近底部的convertRomanToArabic JavaScript函数。其余的只是样板和线束。

    我做到了这一切都在一个文件中。将其保存到名为index.html(或任何您喜欢的)的文件中,然后在浏览器中打开它。如果您发现任何错误或有任何改进想法,请告诉我。

    <!doctype html>
    <html>
    <head>
        <title>Roman To Arabic Converter</title>
        <!--
        <link rel="stylesheet" href="roman.css" type="text/css" media="screen">
        -->
        <style>
            body { width:900px; margin:auto; height:100%; overflow:hidden;  background-color:#eee; font-size:125%; }
            #label-input { font-size: 1.2em; font-style: bold; }
            #label-note { font-size: .9em; font-style: italic; } 
            #label-roman, #label-arabic { color:blue; }
        </style>
    </head>
    <body>
        <header>
            <!-- Always use a CDN, unless your network blocks it. -->
            <!--
            <script type="text/javascript"
                src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
            </script>
    
            <!-- Use a local library if your network doesn't let you get to a CDN. -->
            <!--
            <script type="text/javascript"
                src="js/lib/jquery-2.1.1.min.js">
            </script>
            -->
        </header>
        <p>
        <label id="label-input">Enter a Roman numeral below and press ENTER to convert it to an Arabic numeral</label>
        <br>
        <input type="text" id="roman-input"></input>
        <p>
        Roman:
        <label id="label-roman"></label>
        <p>
        Arabic:
        <label id="label-arabic"></label>
        <p>
        <label id="label-note">Note: I don't stop you from entering invalid Roman numerals, e.g. IXX, and they don't evaluate correctly.</label>
        <script>
            var
                convertRomanToArabic,
                Roman,
                Arabic,
                Map,
                MapList,
                RomanFragment,
                init;
    
            $("#roman-input").on("keypress", function(event){
                if (event.keyCode === 13) {
                    convertRomanToArabic();
                    $("#roman-input").focus();
                    window.setTimeout(function(){
                        $('#inputTodo').focus();
                    }, 50);
                }
            });
    
            init = function() {
                    $("#roman-input").focus();
                    window.setTimeout(function(){
                        $('#inputTodo').focus();
                    }, 50);         
            }();
    
            convertRomanToArabic = function() {
                var x,
                    fragment;
    
                Map = {};
                Map['I'] = 1;
                Map['V'] = 5;
                Map['X'] = 10;          
                Map['L'] = 50;
                Map['C'] = 100;
                Map['D'] = 500;
                Map['M'] = 1000;
                Arabic = 0;
                RomanFragment = "";
                Roman = $("#roman-input").val().toUpperCase();
                $("#label-roman").text(Roman);
                for (x=0; x < Roman.length-1; x++) {
                    if (Map[Roman.substr(x+1,1)] <= Map[Roman.substr(x,1)]) {
                        if (RomanFragment !== "") {
                            Arabic -= Map[RomanFragment];
                            RomanFragment = "";
                        };
                        Arabic += Map[Roman.substr(x,1)];
                    } else {
                        RomanFragment += Roman.substr(x,1);
                    };
                };
                if (RomanFragment !== "") {
                    Arabic -= Map[RomanFragment];           
                    RomanFragment = "";
                };
                Arabic += Map[Roman.substr(Roman.length-1)];
                $("#label-arabic").text(Arabic);
            };
        </script>
    </body>
    </html>
    

答案 1 :(得分:0)

可能是这个吗? =)

public class TEST
{
public int romanInput() {       
    return convert(getUserInput());
}   
public String getUserInput()
{
    Scanner numberInput = new Scanner (System.in);
    System.out.print("Enter a roman numeral in uppercase: ");
    String userInput = numberInput.next();
    numberInput.close();
    return userInput;
}   
public int convert(String userInput)
{
    int result = 0;
    for (int x = userInput.length() - 1; x >= 0 ; x--) {
        char romanConvert = userInput.charAt(x);
        switch (romanConvert) {
            case 'I':
                result += 1;
                break;
            case 'V':
                result += 5;
                break;
            case 'X':
                result += 10;
                break;
            case 'L':
                result += 50;
            case 'C':
                result += 100;
                break;
            case 'D':
                result += 500;
                break;
            case 'M':
                result += 1000;
                break;
        }
    }
    return result;
}

public void printValue()
{
    System.out.println(romanInput());
}

public static void main(String[] args) {
    new TEST().printValue();
}
}

答案 2 :(得分:0)

不幸的是,要做到这一点,你需要从右到左,因为这是罗马数字的工作方式。例如,IXC是100 - 10 - 1,而不是100 - (10 - 1)。要做到这一点,我建议这样的事情:

int result = 0;
int subtractamount = 0;
int x = userInput.length();
while(x != 0) {
char romanConvert = userInput.charAt(x);
    if(x >= 1) {
        if(convertChar(romanConvert) >= convertChar(userInput.charAt(x - 1)) {
            subtractamount += convertChar(userInput.charAt(x - 1))
        }
    }
    result += convertChar(romanconvert);
    x--;
}
result -= subtractamount;
return result;

为重复添加新方法:

public static char convertChar(char value) {
    switch (value) {
        case 'I':
            return 1;
            break;
        case 'V':
            return 5;
            break;
        case 'X':
            return 10;
            break;
        case 'L':
            return 50;
        case 'C':
            return 100;
            break;
        case 'D':
            return 500;
            break;
        case 'M':
            return 1000;
            break;
        default:
            System.out.println("Invalid character!");
            return 0;
            break;
    }

}

工作原理:while循环从右到左进行操作,并预先判断是否有一个小于或等于被转换字符的数字。如果是,则添加数量等于要减去的数量。然后,它将转换后的字符值添加到结果中。完成后,它会从结果中减去给定的数量,从而得到适当的从右到左的结果。我添加了其他方法,因为我不想每次都重复它。

答案 3 :(得分:0)

假设有效输入,从右到左遍历罗马数字可以一次完成一个字符,但是你需要记住前一个字符(cur字符右边的字符),这样你就可以了可以减去cur_char的值,如果它小于prev_char。否则,您只需从右到左添加char值。

我已经看到了许多其他似乎完全有效的方法。