因为String处理bar其实很难,便把那些小写了。下面便是我尝试的code。
import java.util.HashMap;
import java.util.Scanner;
/**
* Roman Numerals
* This class create Roman numbers object
* and do the corresponding calculations
* Maximum should be less than 1 million
*/
public class RomanNumeral{
// listed are the fields
// lower case stand for bar on top
private static int romanCount=0;
private int number;
private String romanString;
private static HashMapsymbolToValue = initSymbolToValue();
private static char[][] valueToSymbol = initValueToSymbol();
//constructors
public RomanNumeral(){
/**
* default constructor
* set number to 0
*/
number =0;
romanString = "";
romanCount++;
}
// initialize with a number
public RomanNumeral(int num){
number = num;
romanString = numberToRoman(num);
romanCount++;
}
// initialization with a String,
public RomanNumeral(String str){
romanString = str;
number = romanToNumber(romanString);
romanCount++;
}
public String toString(){
return romanString;
}
// from now on are the methods used for the class
// Accessors and modifiers
public int getNumber(){
return number;
}
public String getRomanString(){
return romanString;
}
public void setNumber(int num){
number = num;
romanString = numberToRoman(number);
}
public void setRomanString(String rstr){
romanString = rstr;
number = romanToNumber(romanString);
}
// Arithmetic methods for Roman Numerals
public boolean equals(RomanNumeral rn){
if (number == rn.getNumber())
return true;
else return false;
}
public int compare(RomanNumeral rn1, RomanNumeral rn2){
// 1 means greater, 0 means equal, while -1 means smaller
int num1 = rn1.getNumber(), num2 = rn2.getNumber();
if(num1>num2)
return 1;
else if (num1 < num2)
return -1;
else return 0;
}
public RomanNumeral add(RomanNumeral rn1){
return (new RomanNumeral(number+rn1.getNumber()));
}
public RomanNumeral subtractedBy(RomanNumeral rn1){
return (new RomanNumeral(number-rn1.getNumber()));
}
public RomanNumeral multipliedBy(RomanNumeral rn1){
return (new RomanNumeral(number*rn1.getNumber()));
}
public RomanNumeral dividedBy(RomanNumeral rn1){
return (new RomanNumeral(number/rn1.getNumber()));
}
// static methods here
public static int getCount(){
return romanCount;
}
public static RomanNumeral pow(RomanNumeral rn1, RomanNumeral rn2){
int num = (int)Math.pow(rn1.getNumber(), rn2.getNumber());
return (new RomanNumeral(num));
}
public static HashMapinitSymbolToValue(){
HashMapsymToVal = new HashMap(13);
symToVal.put('I', 1);
symToVal.put('V', 5);
symToVal.put('X', 10);
symToVal.put('L', 50);
symToVal.put('C', 100);
symToVal.put('D', 500);
symToVal.put('M', 1000);
symToVal.put('v', 5000);
symToVal.put('x', 10000);
symToVal.put('l', 50000);
symToVal.put('c', 100000);
symToVal.put('d', 500000);
symToVal.put('m', 1000000);
return symToVal;
}
public static char[][] initValueToSymbol(){
char[][] valToSym = {
{'I', 'V', 'X'},
{'X', 'L', 'C'},
{'C', 'D', 'M'},
{'M', 'v', 'x'},
{'x', 'l', 'c'},
{'c', 'd', 'm'},
{'m',},
};
return valToSym;
}
protected String numberToRoman(int num){
if (num == 0)
return "";
StringBuffer[] strBuf = new StringBuffer[7];
int count=0;
do {
strBuf[count]= new StringBuffer();
int remainder = num%10;
char[] symArr= valueToSymbol[count];
String temp;
if (remainder == 0){
count++;
continue;
}
else if (remainder <= 3){
for( ; remainder>0; remainder--)
strBuf[count].append(symArr[0]);
}
else if (remainder ==4){
temp = "" + valueToSymbol[count][0]+symArr[1];
strBuf[count].append(temp);
}
else if (remainder >= 5 && remainder <= 8){
strBuf[count].append(symArr[1]);
remainder -= 5;
for(; remainder>0; remainder--)
strBuf[count].append(symArr[0]);
}
else {
temp = ""+symArr[0]+symArr[2];
strBuf[count].append(temp);
}
count++;
num = num/10;
} while(num !=0 );
String resultStr ="";
for(count--; count>=0; count--){
resultStr += strBuf[count].toString();
}
return resultStr;
}
/* it is assumed that roman string is in upper case*/
protected int romanToNumber(String roman){
if (roman.equals(""))
return 0;
else if (roman.charAt(0)=='-')
return -1 * romanToNumber(roman.substring(1));
else if(roman.length() ==1)
return symbolToValue.get(roman.charAt(0));
else {
if (symbolToValue.get(roman.charAt(0))< symbolToValue.get(roman.charAt(1)))
return -1 * symbolToValue.get(roman.charAt(0)) + romanToNumber(roman.substring(1));
else return symbolToValue.get(roman.charAt(0)) + romanToNumber(roman.substring(1));
}
}
/*++++++++++++++++++++++++++++++++++++++*/
public static void main(String[] args) throws Exception{
RomanNumeral year= new RomanNumeral("MMXI");
RomanNumeral rnum = new RomanNumeral(1234);
System.out.println("In the year " + rnum.getRomanString()+ ", Jin is defeatly completed by Mongolians.");
System.out.println(year.getRomanString() + " the current year, which is "+ year.getNumber()+".");
System.out.println(year.add(rnum));
Scanner sc = new Scanner(System.in);
System.out.println("Please enter a new number for processing=>");
RomanNumeral rnInput = new RomanNumeral(Integer.parseInt(sc.nextLine()));
System.out.println(rnInput);
}
/*++++++++++++++++++++++++++++++++++++++*/
}
写的不够好,不过真的搞的蛮久的。
好复杂的样子,改天给你写个Python版本,见识下啥叫简洁.....
ReplyDelete赶快贴出来吧,我去顶。
ReplyDelete