羅馬數字轉換為十進位制數字
阿新 • • 發佈:2019-02-15
<pre name="code" class="html">給定一個羅馬數字s,( I<=s<=MMMCMXCIX)(即1到3999),將羅馬數字轉換成整數。 如羅馬數字I,II,III,IV,V分別代表數字1, 2, 3, 4, 5。 格式: 第一行輸入一個羅馬數字,接下來輸出對應的整數。 提示: 首先要來了解一下羅馬數字表示法,基本字元有7個:I,V,X,L,C,D,M,分別表示1,5,10,50,100,500,1000。 在構成數字的時候,有下列規則: 1、相同的數字連寫,所表示的數等於這些數字相加得到的數,如:Ⅲ = 3; 2、小的數字在大的數字的右邊,所表示的數等於這些數字相加得到的數, 如:Ⅷ = 8;Ⅻ = 12; 3、小的數字,(限於Ⅰ、X 和C)在大的數字的左邊,所表示的數等於大數減小數得到的數,如:Ⅳ= 4;Ⅸ= 9; 4、正常使用時,連寫的數字重複不得超過三次。 樣例1 輸入: CXXIII 輸出: 123
MMMCMXCIXpackage rome_to_decimal_1; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Scanner; public class Main { public static int reap_main_right = 0; public static int reap_main_left = 0; public static void main(String[] args) { int sum = 0; int sum_right = 0; int sum_left = 0; String string_right = ""; String string_left = ""; ArrayList<String> list = new ArrayList<String>(); ArrayList<Integer> listNum = new ArrayList<Integer>(); Scanner input = new Scanner(System.in); String string = input.nextLine(); ///String string = "CXXIII"; int len = string.length(); while(len>=1){ if(len==1){ string_right=string.substring(0, 1); ///System.out.println(string_right); list.add(String.valueOf(multi(string_right))); break; //// while for 裡面均可以有break語句; }else{ String subString=string.substring(0, len); reap_main_right = repeat(subString); len=len-reap_main_right; string_right = string.substring(subString.length() - reap_main_right,subString.length()); ///System.out.println(string_right); list.add(String.valueOf(multi(string_right))); } }///while ///System.out.println("---------------"); for(int i=list.size()-1;i>=0;i--){ listNum.add(Integer.valueOf(list.get(i))); } // Iterator it = listNum.iterator(); // while(it.hasNext()){ // System.out.println(it.next()); // } for(int j=list.size()-1;j>=1;j--){ if(listNum.get(j)>listNum.get(j-1)){ listNum.set(j-1, listNum.get(j)-listNum.get(j-1)); listNum.remove(j); }else{ listNum.set(j-1, listNum.get(j-1)+listNum.get(j)); listNum.remove(j); } } System.out.println(listNum.get(0)); }// /main // ///從後往前運算,統計出現的重複字母數 public static int repeat(String str) { // int i = str.length() - 1; int reap_reap = 1; char endChar = str.charAt(str.length() - 1); for (int i = str.length() - 2; i >= 0; i--) { if (str.charAt(i) == endChar) { reap_reap++; } else { break; } } return reap_reap; }////repeat // ////連續位數的和是多少 public static int multi(String str) { if (str.contains("I")) { return 1 * str.length(); } else if (str.contains("X")) { return 10 * str.length(); } else if (str.contains("L")) { return 50 * str.length(); } else if (str.contains("C")) { return 100 * str.length(); } else if (str.contains("D")) { return 500 * str.length(); } else if (str.contains("M")) { return 1000 * str.length(); } return 0; }////multi }
3999
方法二:
public class Main { //羅馬數字表示法,基本字元有7個:I,V,X,L,C,D,M,分別表示1,5,10,50,100,500,1000。 public int romanToInt(String s) { int sum = 0; //先減去2倍,後面再遇到時每一位都是再加一次,所以還是減去了一次 if (s.indexOf("IV") != -1) sum -= 2; if (s.indexOf("IX") != -1) sum -= 2; if (s.indexOf("XL") != -1) sum -= 20; if (s.indexOf("XC") != -1) sum -= 20; if (s.indexOf("CD") != -1) sum -= 200; if (s.indexOf("CM") != -1) sum -= 200L; char[] c = s.toCharArray(); for (int i = 0; i < s.length(); i++) { if (c[i] == 'I') sum += 1; if (c[i] == 'V') sum += 5; if (c[i] == 'X') sum += 10; if (c[i] == 'L') sum += 50; if (c[i] == 'C') sum += 100; if (c[i] == 'D') sum += 500; if (c[i] == 'M') sum += 1000; } return sum; }//romanToInt public static void main(String[] args) { System.out.println(new Main().romanToInt("XXX"));//30 System.out.println(new Main().romanToInt("IVXX"));//24 System.out.println(new Main().romanToInt("IXXX"));//29 System.out.println(new Main().romanToInt("CDCXXI"));//521 } }