我正在尝试找到最简单的算法来将罗马数字转换为int.I有来自Rosetta代码的代码,但代码中的一些东西没有意义。
在下面的代码中的for循环中,罗马数字是如何迭代的?可以解释嵌套for循环如何工作,或者你有一个更简单的方法来编写这个算法
public class Roman {
enum Numeral {
I(1), IV(4), V(5), IX(9), X(10), XL(40), L(50), XC(90), C(100), CD(400), D(500), CM(900), M(1000);
int weight;
Numeral(int weight) {
this.weight = weight;
}
};
public static String roman(long n) {
if( n <= 0) {
throw new IllegalArgumentException();
}
StringBuilder buf = new StringBuilder();
final Numeral[] values = Numeral.values();
for (int i = values.length - 1; i >= 0; i--) {
while (n >= values[i].weight) {
buf.append(values[i]);
n -= values[i].weight;
}
}
return buf.toString();
}
public static void test(long n) {
System.out.println(n + " = " + roman(n));
}
public static void main(String[] args) {
test(1999);
test(25);
test(944);
test(0);
}
答案 0 :(得分:0)
罗马文字从最高到最低迭代。这很有道理。这是应该如何做到的,因为你想先提取最大的项目。一旦完成它,你想要提取第二大项目,依此类推。在提取项目时,它可能适合您当前剩余的数字0,1,2,3,...次。这就是这个循环的意义/目的。
while (n >= values[i].weight) {
buf.append(values[i]);
n -= values[i].weight;
}
我认为这是编写此算法的最简单方法。你只需要掌握这个想法。
答案 1 :(得分:0)
public int romanToInt(String s) {
int total = 0, currentVal = 0, prevVal = 0;
for(int i=s.length()-1; i>=0; i--) {
switch(s.charAt(i)) {
case 'I' : currentVal = 1; break;
case 'V' : currentVal = 5; break;
case 'X' : currentVal = 10; break;
case 'L' : currentVal = 50; break;
case 'C' : currentVal = 100; break;
case 'D' : currentVal = 500; break;
case 'M' : currentVal = 1000; break;
default: break;
}
total += (currentVal < prevVal) ? -1 * currentVal : currentVal;
prevVal = currentVal;
}
return total;
}