这边的新编程学生。试图将罗马数字输入转换为它的整数值。我一直在这里使用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个方法和一个主要方法!
因此,一旦我弄清楚如何编写算法,我就需要构建一个输出用户输入的数字和转换后的数字的方法。这会是这样的:
System.out.println("The number you entered was: " +romanInput(input));
然后对转换后的罗马数字执行相同的操作。我应该以该方法回归什么?
我不想仅仅复制其他帖子上的内容,因为我正在尝试理解该程序应该如何工作。这是一个在线课程,所以不幸的是我只有一本书作为这项任务的指南,所以我非常感谢更有经验的程序员的帮助。
答案 0 :(得分:1)
这显然不是您问题的完整解决方案,但这是一种通用算法。
我确定我错过了一些东西,但这应该给你一个很好的起点。
有人会想到一个破坏这个算法的负面测试吗?
<强>更新强>
正如我对此的想法更多,对于快速面试消除轮次而言,这似乎是一个非常好的紧凑问题。候选人应该能够在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值。
我已经看到了许多其他似乎完全有效的方法。