个人原创,谢谢支持
代码个人编写,实测有效,欢迎转载本文链接。https://blog.csdn.net/u014730287/article/details/103399779
逻辑规则
给定一个罗马数字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、正常使用时,连写的数字重复不得超过三次。
实现代码
import com.sun.istack.internal.NotNull;
import java.util.Arrays;
import java.util.List;
/**
* 罗马数字转换为阿拉伯数字
* @author fkptxmz
*/
public class RomaTransitionNum {
/**
* 罗马列表
*/
private final static List<String> ROMA_LIST = Arrays.asList("M","D","C","L","X","V","I");
/**
* 罗马数字对应阿拉伯数字列表
*/
private final static List<Integer> NUM_LIST = Arrays.asList(1000,500,100,50,10,5,1);
/**
* 前一个罗马数字
*/
private String preRoma;
/**
*当前罗马数字
*/
private String curRoma;
/**
*阿拉伯数字总和
*/
private int countNum;
/**
*当前阿拉伯数字总和
*/
private int curNum;
/**
* 初始化全局参数
*/
private void init(){
this.preRoma = "";
this.curRoma = "";
this.countNum = 0;
this.curNum = 0;
}
/**
* 执行方法入口
* @param romaStr 罗马字符串
* @return int 返回转换完成的阿拉伯数字
*/
public int romaToNum(String romaStr){
if(StringUtils.isNotEmpty(romaStr)){
init();
for (int i = 0; i < romaStr.length(); i++) {
execute(String.valueOf(romaStr.charAt(i)));
}
// 处理最后的一段相同的罗马字母,否则会丢失
countNum += curNum;
}
return countNum;
}
//启动方法
public static void main(String[] args) {
//3999
String romaString = "MMMCMXCIX";
System.out.println(new RomaTransitionNum().romaToNum(romaString));
}
/**
* 执行方法,核心代码
* @param roma 罗马字母
*/
private void execute(String roma){
if(StringUtils.isNotEmpty(roma)){
curRoma = roma;
if(StringUtils.isEmpty(preRoma) || curRoma.equals(preRoma)){
// 如果当前字符已前一个字符相同,或者前一个字符为空(代表当前为第一个字符),则当前数字相加
curNum += getCurRomaNum(curRoma);
}else{
//当前字符与前一个字符不相同,则需要比较分位计算
if(ROMA_LIST.indexOf(curRoma) > ROMA_LIST.indexOf(preRoma)){
//当前字符位数小于前一个字符位数,则直接相加,
countNum += curNum;
//并重置当前数字为当前字符代表数字
curNum = getCurRomaNum(curRoma);
}else{
//否则,进行相减操作,
curNum = getCurRomaNum(curRoma) - curNum;
//之后再计算和,
countNum += curNum;
//最后将当前数字置空
curNum = 0;
}
}
preRoma = curRoma;
}
}
/**
* 获取当前罗马数字对应的阿拉伯数字
* @param roma 罗马数字
* @return int 阿拉伯数字
*/
private int getCurRomaNum(@NotNull String roma){
return NUM_LIST.get(ROMA_LIST.indexOf(roma));
}
}