罗马字符与整数互转的关系_整数转罗马数字 java

罗马字符与整数互转的关系_整数转罗马数字 javaGivenaromannumeral,convertittoaninteger.Inputisguaranteedtobewithintherangefrom1to3999.思路罗马数字有如下符号:基本字符IVXLCDM对应阿拉伯数字1510501005001

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

Given a roman numeral, convert it to an integer. Input is guaranteed
to be within the range from 1 to 3999.

思路

罗马数字有如下符号:

基本字符 I V X L C D M
对应阿拉伯数字 1 5 10 50 100 500 1000

1~9: {“I”, “II”, “III”, “IV”, “V”, “VI”, “VII”, “VIII”, “IX”};

10~90: {“X”, “XX”, “XXX”, “XL”, “L”, “LX”, “LXX”, “LXXX”, “XC”};

100~900: {“C”, “CC”, “CCC”, “CD”, “D”, “DC”, “DCC”, “DCCC”, “CM”};

1000~3000: {“M”, “MM”, “MMM”}.

计数规则:
相同的数字连写,所表示的数等于这些数字相加得到的数,例如:III = 3
小的数字在大的数字右边,所表示的数等于这些数字相加得到的数,例如:VIII = 8
小的数字,限于(I、X和C)在大的数字左边,所表示的数等于大数减去小数所得的数,例如:IV = 4
正常使用时,连续的数字重复不得超过三次
在一个数的上面画横线,表示这个数扩大1000倍(本题只考虑3999以内的数,所以用不到这条规则)

其次,罗马数字转阿拉伯数字规则(仅限于3999以内):

从前向后遍历罗马数字,如果某个数比前一个数小,则加上该数。反之,减去前一个数的两倍然后加上该数.

代码如下:

/** * [romanToInt description] 罗马字符转换为整数 * @param [type] $str 罗马字符 * @return [type] 转化后的整数 */
function romanToInt($str) { 
   
    if (strlen($str) < 1) 
        return false;
    $res = charToNumber($str[0]);
    for ($i = 1; $i < strlen($str); $i++) {
        $pre = charToNumber($str[$i - 1]);
        $cur = charToNumber($str[$i]);
        if ($pre < $cur) {
            $res += $cur - 2 * $pre;
        } else {
            $res += $cur;
        }
    }
    return $res;
}

// 第二种方法
function romanToInt2($str) { 
   
    if (strlen($str) < 1) 
        return false;
    $res = 0;
    for ($i = 0; $i < strlen($str); $i++) {
        $val = charToNumber($str[$i]);
        if ($i == strlen($str) - 1 || charToNumber($str[$i + 1]) <= $val)
            $res += $val;
        else 
            $res -= $val;
    }
    return $res;
}

/** * [charToNumber description] 单个罗马字符转化为对应的数字 * @param [type] $char 单个罗马字符 * @return [type] 对应的整数 */
function charToNumber($char) { 
   
    switch ($char) {
        case 'I': return 1; break;  
        case 'V': return 5; break;
        case 'X': return 10; break;
        case 'L': return 50; break;
        case 'C': return 100; break;
        case 'D': return 500; break;
        case 'M': return 1000; break;
    }
    return 0;
}

echo romanToInt1('IX');
echo romanToInt2('IX');

整数转为罗马字符数字:

/** * 整数转换为罗马字符数字 * @param Integer $number 要转化的整数 * @return String 转化后的罗马字符数字 */
function intToRoman($number) { 
   
    $values = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
    $romanChars = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"];
    $res = '';
    for($i = 0; $i < count($values); $i++) {
        while ($number >= $values[$i]) {
            $number -= $values[$i];
            $res .= $romanChars[$i];
        }
    }
    return $res;
}

// 方法二
function intToRoman2($number) { 
   
    $M = ["", "M", "MM", "MMM"];
    $C = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"];
    $X = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"];
    $I = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"];
    return $M[$number / 1000] . $C[floor($number % 1000 / 100)] . $X[floor($number % 100 / 10)] . $I[floor($number % 10)];
}
echo intToRoman(1001);
echo intToRoman2(1001);
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187625.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 卸载pip包并卸载其依赖包[通俗易懂]

    卸载pip包并卸载其依赖包[通俗易懂]原创工具程序,卸载指定的pip包并递归卸载其依赖包使用方法:将以下代码保存为pip_uninst_rec.py,执行pythonpip_uninst_rec.py<pkg>即可importargparseimportosfromcollectionsimportdequeimportpip._internal.commands.showasshow_cmddefmain():parser=argparse.ArgumentParser(des

    2022年10月16日
  • 图像特征匹配方法——SIFT算法原理及实现

    图像特征匹配方法——SIFT算法原理及实现传统图像处理中图像特征匹配有三个基本步骤:特征提取、特征描述和特征匹配。特征提取就是从图像中提取出关键点(或特征点、角点)等。特征描述就是用一组数学向量对特征点进行描述,其主要保证不同的向量和不同的特征点之间是一种对应的关系,同时相似的关键点之间的差异尽可能小。特征匹配其实就是特征向量之间的距离计算,常用的距离有欧氏距离、汉明距离、余弦距离等。SIFT算法又叫尺度不变特征变换匹配算法,SIF…

    2022年6月22日
  • 激光SLAM流程_激光打眼

    激光SLAM流程_激光打眼基于环境自然导航激光叉车:基于环境自然导航的激光导航叉车AGV中,机器人在运动过程中通过编码器结合IMU计算得到里程计信息,运用机器人的运动模型得到机器人的位姿初估计,然后通过机器人装载的激光传感器获取的激光数据结合观测模型(激光的扫描匹配)对机器人位姿进行精确修正,得到机器人的精确定位,最后在精确定位的基础上,将激光数据添加到栅格地图中,反复如此,机器人在环境中运动,最终完成整个场景地图的构建…

    2022年8月23日
  • 干货请收好:终于有人把用户画像的流程、方法讲明白了「建议收藏」

    干货请收好:终于有人把用户画像的流程、方法讲明白了「建议收藏」导读:用户画像将产品设计的焦点放在目标用户的动机和行为上,从而避免产品设计人员草率地代表用户。产品设计人员经常不自觉的把自己当作用户代表,根据自己的需求设计产品,导致无法…

    2022年6月1日
  • apache2服务器_apache2配置

    apache2服务器_apache2配置摘要:在本地做WEB开发,同时多个项目,希望将每个项目都使用一个域名指向各自的项目根目录。要实现这样的目的,虚拟主机是必须要掌握的。本篇从一个小白用户的视角开始从零开始深入了解并实例配置演示。

    2022年9月18日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号