我正在尝试将罗马数字转换为阿拉伯数字。我拿一个字符串并运行一个循环检查每个字符的值。因此'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)
答案 0 :(得分: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);
}
在此行,您设置val_next
。对于最后一次迭代,它保留了先前值的迭代,因为它围绕if循环,因此它将500
保持MCD
,因为它在500
中设置为C
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);
}
的迭代。
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);
}
我假设你需要将它重置为0进行计算。
Enter Roman numerals: MCD
1000 100
100 500
500 0
输出变为:
{{1}}
既然你已经说过你现在只想要这些值,我会把实际算法留给你:D
答案 1 :(得分:0)
你正在重新检查这个元素。因此,根据您编写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;
}
}