罗马字符与整数互转的关系_整数转罗马数字 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • nodejs – linux安装[通俗易懂]

    nodejs – linux安装[通俗易懂]1、下载http://nodejs.cn/download/2、安装tar-xzvf node-v12.16.0-linux-x64.tar.gz3、配置路径ln-s/hom

    2022年7月2日
    26
  • oracle恢复删除数据

    oracle恢复删除数据1。select*fromznjtresource.t_device_epoliceasoftimestampto_timestamp(‘2019-3-2115:20:00′,’yyyy-mm-ddhh24:mi:ss’)2,。insertintoznjtresource.t_device_epolice(select*fromznjtresource.t_devi…

    2022年7月17日
    12
  • 用opencv的dnn模块做yolov5目标检测[通俗易懂]

    用opencv的dnn模块做yolov5目标检测[通俗易懂]最近在微信公众号里看到多篇讲解yolov5在openvino部署做目标检测文章,但是没看到过用opencv的dnn模块做yolov5目标检测的。于是,我就想着编写一套用opencv的dnn模块做yolov5目标检测的程序。在编写这套程序时,遇到的bug和解决办法,在这篇文章里讲述一下。在yolov5之前的yolov3和yolov4的官方代码都是基于darknet框架的实现的,因此opencv的dnn模块做目标检测时,读取的是.cfg和.weight文件,那时候编写程序很顺畅,没有遇到bug。但是yolo

    2022年10月13日
    3
  • 二进制与十进制的转换教案「建议收藏」

    二进制与十进制的转换教案「建议收藏」【教学目的与要求】1、熟悉数制的概念;2、掌握位权表示法; 3、熟练掌握二进制与十进制之间的转换方法。【课时安排】1课时。【教学重点与难点】1、难点:位权表示法 十进制转化为二进制   2、重点:二、十进制间相互转换【教学过程】(以下教师的语言、活动简称“师”,学生的活动简称“生”)新课导入师:猜一猜:简单的数字:10,这是几?     我认为这是2…

    2022年10月17日
    1
  • 前端学习笔记 – promise是什么?能解决什么问题?

    前端学习笔记 – promise是什么?能解决什么问题?返回目录promise是什么?promise是异步编程的一种解决方案:从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。promise有三种状态:pending(等待态),fulfiled(成功态),rejected(失败态);Promise有以上三种状态,只有异步操作的结果可以决定当前是哪一种状态,其他任何操作都无法改变这个状态状态一旦改变,就不会再变,任何时候都可以得

    2022年6月8日
    62
  • opencv 人脸识别 (二)训练和识别

    opencv 人脸识别 (二)训练和识别上一篇中我们对训练数据做了一些预处理,检测出人脸并保存在\pic\color\x文件夹下(x=1,2,3,…类别号),本文做训练和识别。为了识别,首先将人脸训练数据转为灰度、对齐、归一化,再放入分类器(EigenFaceRecognizer),最后用训练出的model进行predict。—————————————–环境:vs2010+op

    2022年6月1日
    53

发表回复

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

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