/* arabic.java (c)1999 A.Matsuda */ import java.awt.*; import java.awt.event.*; import java.awt.Toolkit.*; import java.applet.*; import java.util.*; import java.lang.*; import java.text.*; import java.lang.System.*; public class arabic { static final char delimiter = (char)-1; class elem{ char c; int v; public elem(char c, int v){ this.c = c; this.v = v; } public char getChar() { return c; } public int getVal() { return v; } }; elem tbl[]={ new arabic.elem( 'm', 1000 ), new elem( 'd', 500 ), new elem( 'c', 100 ), new elem( 'l', 50 ), new elem( 'x', 10 ), new elem( 'v', 5 ), new elem( 'i', 1 ), new elem( delimiter , -1 ), }; boolean chkv( char c ) { int i; for( i = 0 ; ; i++ ){ if( tbl[i].getChar() == delimiter ){ break; } if( tbl[i].getChar() == c ){ return true; } } return false; } int getv( char c ) { int i; for( i = 0 ; ; i++ ){ if( tbl[i].getChar() == (char)-1 ){ break; } if( c == tbl[i].getChar() ){ return tbl[i].getVal(); } } return -1; } int arabic( String buf ) throws Exception { int prev = 0; int current = 0; int i; int val = 0; int cnt = 0; buf.trim(); buf = buf.toLowerCase(); for( i = 0 ; i < buf.length() ; i ++ ){ if( chkv( buf.charAt( i ) ) == true ){ current = getv( buf.charAt( i ) ); if( prev == current){ cnt++; } else{ if( prev < current && cnt >= 1 ){ //2回以上引かれる数より小さな数が続いた後に減算を行う事はない throw new Exception("書式が不正です"); } cnt = 0; } if( current > prev && prev != 0 ){ if( prev * 5 != current && prev * 10 != current ){ throw new Exception("書式が不正です"); } if( prev == 5 || prev == 50 || prev == 500 ){ throw new Exception("書式が不正です"); } val -= prev * 2; val += current; prev = current - prev; } else{ //一度減算をおこなったら、currentよりも小さな値であるべき if( prev != 0 && ( ( ( prev % 9 ) == 0 ) && ( ( prev / 9 ) <= current) ) ) { throw new Exception("書式が不正です"); } if( prev != 0 && ( prev == 4 || prev == 40 || prev == 400 ) && ( (prev / 4) <= current ) ){ //減算が行われた直後に同じ桁の数は並ばない。 throw new Exception("書式が不正です"); } if( ( prev == 5 || prev == 50 || prev == 500 ) && (cnt >= 1 ) ){ throw new Exception("書式が不正です"); } val += current; prev = current; } } else{ throw new Exception("不正な文字が含まれています"); } } return val; } public static void main( String arg[] ) { int i; int val; arabic arabic = new arabic(); for( i = 0 ; i < arg.length ; i++ ){ try{ val = arabic.arabic( arg[ i ] ); } catch( Exception e ){ System.out.println( e.getMessage() ); continue; } System.out.println( arg[i] + "-->" + new Integer(val).toString() ); } }; };