罗马数字转换为十进制数字

<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

package 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

}
MMMCMXCIX
3999

你可能感兴趣的:(算法,数制转换)