罗马数字和阿拉伯数字都是两个伟大和神奇的发明,各自代表着先进的文化,它们之间有一定的转换关系,设计一个算法,实现互相转换。
一,罗马数字:I V X L C D M 分别代表 1,5,10,50,100,500,1000 其中表示方法如下:
罗马数字 阿拉伯数字 计算方法
I 1 1
II 2 1+1
III 3 1+1+1
IV 4 -1+5
V 5 5
VI 6 5+1
IX 9 -1+10
X 10 10
... ... ...
设计一个 char 数组存储罗马字符,char roman[] = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};
设计一个 int 数组存储罗马字符对应的数字int value[] = {1000, 500, 100, 50, 10, 5, 1};
分析罗马数字1--9,区间可以分为:<4,4 ,>4&&<9,9 这四个区间,只需要 I 和 V 两个字符表示,同理10--90 中10的整数倍也只需要 L 和 X 两个数表示,个位数借助 I 和 V 表示。
public String intToRoman(int num) {
String sroman = "";
char roman[] = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};
int value[] = {1000, 500, 100, 50, 10, 5, 1};
int remainder = 0;
for (int i = 0; i < 7; i += 2) {
remainder = num / value[i];
if (remainder < 4) {
for (int k = 0; k < remainder; k++) {
sroman += roman[i];
}
} else if (remainder == 4) {
sroman = sroman + roman[i] + roman[i - 1];
} else if (remainder > 4 && remainder < 9) {
sroman += roman[i - 1];
for (int k = 5; k < remainder; k++) {
sroman += roman[i];
}
} else if (remainder == 9) {
sroman = sroman + roman[i] + roman[i - 2];
}
num %= value[i];
}
return sroman;
}
分析IV 为 -1+5 ,IX 为-1+10,可以判断当前I 下一位如果是V 或者是 X,需要变为负数,再加下一位数。同理 V 需要判断下一位是X或者是L,变为负数相加。
public int romanToInt(String sroman) {
if (sroman == null || sroman.equals("")) {
return 0;
}
char roman[] = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};
int value[] = {1000, 500, 100, 50, 10, 5, 1};
int num = 0;
for (int i = 0; i < sroman.length(); i++) {
for (int j = 0; j < 7; j++) {
if (sroman.charAt(i) == roman[j]) {
if ((i < sroman.length() - 1) && (j >= 2) && (sroman.charAt(i + 1) == roman[j - 2])) {
num += -value[j];
} else if ((i < sroman.length() - 1) && (j >= 1) && (sroman.charAt(i + 1) == roman[j - 1])) {
num += -value[j];
} else {
num += value[j];
}
}
}
}
return num;
}