我试图用子串来计算阿拉伯数字中罗马数字相等的东西, 并且我不断得到索引超出范围错误。 或者,我有另一种方式,它只会读取第二个数字并完全忽略第一个数字。
System.out.println("What is the number you want converted?");
Scanner scan = new Scanner(System.in);
String Roman = scan.next();
int sum = 0;
for (int x = 0; x<Roman.length(); x++)
{
if (Roman.substring(x,(x+2)).equals("XC"))
{
sum= sum+90;
}
else if (Roman.substring(x,(x+1)).equals("IX"))
{
sum= sum+9;
}
else if (Roman.substring(x).equals("X"))
{
sum= sum+10;
}
else if (Roman.substring(x,(x+2)).equals("IV "))
{
sum= sum+4;
}
else if (Roman.substring(x).equals("V"))
{
sum= sum+5;
}
else if (Roman.substring(x).equals("I"))
{
sum= sum+1;
}
else if (Roman.substring(x).equals("L"))
{
sum= sum+50;
}
else if(Roman.substring(x).equals("C"))
{
sum= sum+100;
}
}
System.out.println(sum);
答案 0 :(得分:0)
代码存在两个问题:
即使你在字符串的末尾,你也在x+2
或x+1
。这导致异常。当剩下不止一个字符时,请确保您只查找XI的XC。
当你读到的字符超过一个符号时,你没有前进,你指的是你正在阅读的符号的长度。这样你可以两次读同一个角色。因此,如果你阅读XC,你应该再增加x
次。
答案 1 :(得分:0)
你有几个问题:
第一个导致你的问题。
快速而又脏的方法是将if (Roman.length()>= x+2 &&
添加到每个双字符子串中,并在代码块中添加x++
。即:
else if (Roman.length() >= x+2 && Roman.substring(x,(x+2)).equals("IV "))
{
sum= sum+4;
x++;
}
这是超级hacky,肯定有更好的方法来解决这个问题。
答案 2 :(得分:0)
巧合的是,我今晚告诉朋友这个问题,他提出了这个相当紧凑的解决方案。比较彼此相邻的两个数字,并且取决于下一个数字是大于还是小于它之前的数字,将其相减或相加。我在这里添加了他的解决方案,也许它可以帮到你。 Stackoverflow上还有一些其他很好的解决方案。请参阅:Converting Roman Numerals To Decimal。
import acm.program.*;
public class RomanNumeralsToArabic extends ConsoleProgram {
public void run() {
/* Read in the roman numeral from the user and store it as a String. */
String romanNumber = readLine("Enter roman number: ");
/* Initialize the array to store the arabic equivalents of the roman numerals in. */
int[] arabicArray = new int[romanNumber.length()];
/* Loop through the charachters of the roman number and store the arabic equivalents in the array. */
for (int i = 0; i < romanNumber.length(); i++) {
char ch = romanNumber.charAt(i);
switch (ch) {
case 'M': arabicArray[i] = 1000; break;
case 'D': arabicArray[i] = 500; break;
case 'C': arabicArray[i] = 100; break;
case 'L': arabicArray[i] = 50; break;
case 'X': arabicArray[i] = 10; break;
case 'V': arabicArray[i] = 5; break;
case 'I': arabicArray[i] = 1; break;
}
}
/* The last roman numeral is always added to the total no matter what it is. */
int result = arabicArray[arabicArray.length - 1];
/* Loop through the array with arabic numbers. If the number in the next bucket is
* less than the one before it, subtract the number. If it is bigger, add it. */
for (int j = 0; j < arabicArray.length - 1; j++) {
if (arabicArray[j] >= arabicArray[j + 1]) {
result += arabicArray[j];
} else {
result -= arabicArray[j];
}
}
/* Print out the result to the screen. */
println("Arabic number: " + result);
}
}