Java实现罗马数字转换为阿拉伯数字

Java实现罗马数字转换为阿拉伯数字

个人原创,谢谢支持

代码个人编写,实测有效,欢迎转载本文链接。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));
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值