2015-04-02 62 views
3

我想找到最簡單的算法來隱藏羅馬數字int.I有這個代碼從羅塞塔代碼,但有代碼中沒有什麼意義的東西很少。羅馬數字整數

在以下代碼的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

除非您向後回答您的問題,否則此枚舉用於將整數轉換爲羅馬數字,而不是將羅馬數字轉換爲整數。 – 2016-01-21 19:21:20

+0

[將羅馬數字轉換爲十進制]可能的重複(http://stackoverflow.com/questions/9073150/converting-roman-numerals-to-decimal) – 2016-01-21 19:23:21

回答

0

的羅馬字文本正在從最高迭代到最低的一個簡單的方法。這非常合理。這是應該怎麼做的,因爲你想先提取最大的項目。一旦你完成了,你想要提取第二大項目,等等。在提取物品時,它可能會將0,1,2,3,...倍放入當前剩餘的數量中。這就是這個循環的意義/目的。

 while (n >= values[i].weight) { 
      buf.append(values[i]); 
      n -= values[i].weight; 
     } 

而且我認爲這幾乎是寫這個算法的最簡單的方法。你只需要掌握這個想法。

+0

重量變量是指什麼? – 2015-04-03 13:36:40

+0

它指的是每個羅馬文字/數字的值,例如對於IV,重量是4。 – 2015-04-03 14:16:34

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; 
    }