展开全部

已经经过验证,可以实现,但输入数字不能有空格

public class Roman {

private final int num; // 罗马数字转换后的阿拉伯数字(十进制)e68a8462616964757a686964616f31333239313461

public Roman(String roman) throws RuntimeException {

if (roman.length() == 0) // 输入为空

{

throw new RuntimeException("不能输入空字符");

}

roman = roman.toUpperCase(); // 所有罗马数字都转换为大写

int i = 0; // 记录罗马数字每个字符的位置

int arabic = 0; // 转换后的阿拉伯数字

while (i < roman.length()) {

char letter = roman.charAt(i); // 罗马数字当前位置的字符

int number = letterToNumber(letter); // 字符转化为阿拉伯数字

if (number < 0) {

throw new RuntimeException("罗马数字中不包含" + letter);

}

i++; // 移动到字符串的下一个位置

if (i == roman.length()) // 罗马数字已处理完毕

{

arabic += number;

} else {

char nextLetter = roman.charAt(i);

int nextNumber = letterToNumber(nextLetter);

if (nextNumber > number) // 后边的字符比前边的大

{

int result = nextNumber - number;

if (result == 4 || result == 9 || result == 40 || result == 90 || result == 400 || result == 900) {

arabic += result;

i++;

if (i == roman.length()) // 罗马数字已处理完毕

{

break;

} else {

char afterNextLetter = roman.charAt(i);

int afterNextNumber = letterToNumber(afterNextLetter);

if (afterNextNumber > result) {

throw new RuntimeException("不合法的罗马数字" + letter + nextLetter + afterNextLetter);

}

}

} else {

throw new RuntimeException("不合法的罗马数字" + letter + nextLetter);

}

} else {

if ((number == 5 || number == 50 || number == 500) && number == nextNumber) // V、L、D用于大数右边(相加),使用超过1次。

{

throw new RuntimeException("不合法的罗马数字" + letter + nextLetter);

}

if (number == nextNumber) {

i++; // 还要再看下一个字符

if (i == roman.length()) // 罗马数字已处理完毕

{

arabic += number + nextNumber;

break;

}

char afterNextLetter = roman.charAt(i);

int afterNextNumber = letterToNumber(afterNextLetter);

if (afterNextNumber > nextNumber) // I、X、C在在大数左边(即相减时)使用超过2个

{

throw new RuntimeException("不合法的罗马数字" + letter + nextLetter + afterNextLetter);

} else if (afterNextNumber == nextNumber) // 出现3个字符都相同的情况,如III

{

i++; // 还要再看下一个字符,可能会出现IIII这种情况(不允许的,应抛出异常)

if (i == roman.length()) // 罗马数字已处理完毕

{

arabic += number + nextNumber + afterNextNumber;

break;

}

char afterNextNextLetter = roman.charAt(i);

int afterNextNextNumber = letterToNumber(afterNextNextLetter);

if (afterNextNextNumber == afterNextNumber) // 出现IIII这种情况

{

throw new RuntimeException("不合法的罗马数字" + letter + nextLetter + afterNextLetter + afterNextNextLetter);

} else {

arabic += number;

i = i - 2; // 回退2个字符(因为考虑了4个字符)

}

} else {

arabic += number + nextNumber;

}

} else {

arabic += number;

}

}

}

}

if (arabic > 3999) {

throw new RuntimeException("输入的数字不能超过3999");

}

num = arabic;

}

/**

* 罗马字符转换为阿拉伯数字

*

* @param letter

* 罗马字符

* @return 正常罗马字符,返回阿拉伯数字;否则,返回-1

*/

private int letterToNumber(char letter) {

switch (letter) {

case 'I':

return 1;

case 'V':

return 5;

case 'X':

return 10;

case 'L':

return 50;

case 'C':

return 100;

case 'D':

return 500;

case 'M':

return 1000;

default:

return -1;

}

}

public int getNum() {

return num;

}

public static void main(String[] args) {

while (true) {

System.out.println();

System.out.print("请输入罗马数字(按Q键退出):");

Scanner cin = new Scanner(System.in);

String romanStr = cin.nextLine();

if (romanStr.equals("q") || romanStr.equals("Q")) // 退出循环

{

break;

}

Roman roman = null;

try {

roman = new Roman(romanStr);

System.out.println(romanStr+" is the year:" + roman.getNum());

} catch (RuntimeException e) {

System.out.println(e);

}

}

}

}

本回答由提问者推荐

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

罗马数字转换 java_JAVA 罗马数字转换成公历年相关推荐

  1. 金额转换java_java金额转换

    像商品价格,订单,结算都会涉及到一些金额的问题,为了避免精度丢失通常会做一些处理,常规的系统中金额一般精确到小数点后两位,也就是分: 这样数据库在设计的时候金额就直接存储整型数据类型,前端可以将金额X ...

  2. 计蒜客挑战难题:整数转换成罗马数字

    给定一个整数num,( 1<=num<=3999),将整数转换成罗马数字. 如1,2,3,4,5对应的罗马数字分别位I,II,III,IV,V等. 格式: 第一行输入一个整数,接下来输出对 ...

  3. JavaScript练习 - 数字转换成罗马数字

    摘要:以下数字转换成罗马数字的方法估计是最傻的办法了. 一.思路 (1)把数字拆分,把每个数字都存入数组arr中: (2)将数组arr中非0的数字存入新的数组arr1中: (3)把数组arr1中的每个 ...

  4. 整型数字转换成罗马数字

    版权声明:本文为博主原创文章,转载请注明出处. 个人博客地址:https://yangyuanlin.club 欢迎来踩~~~~ integer to roman Given an integer, ...

  5. 【LeetCode】【Java】13. 罗马数字转整数——给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

    13. 罗马数字转整数 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 ...

  6. 罗马数字向数字的转换

    Roman to Integer: 罗马数字向数字的转换: 这个算法你只要想明白用一个字典去存储罗马数字就可以了,然后通过输入的罗马数字从字典中拿值就欧克了.我就不多说了 代码如下: class So ...

  7. pdf转ppt怎么转换,pdf转换ppt的方法分享

    工作中为了方便我们在对文件的查看和应用,都会遇到过文件格式的相互转换吧,如果在工作中碰到了PDF文件转换成PPT文件的时候,我们要用什么样的方式转换最容易而又不出错呢,下面小编为大家分享一下小编常用的 ...

  8. PHP是弱类型语言,自动转换,强制转换

    强制转换: (int) - 转换成整型 (bool) - 转换.成布尔型 (float) - 转换成浮点型 (string) - 转换成字符串 (array) - 转换成数组 (object) - 转 ...

  9. Java数据类型转换(自动转换和强制转换)

    数据类型的转换,分为自动转换和强制转换.自动转换是程序在执行过程中"悄然"进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换:强制类型转换则必须在代码中声明,转 ...

  10. .NET代码混淆学习和解决视频批量转换中.wmv转换出错问题

    现在开始对自己一天的工作进行一下大致总结,上午主要是研究ArcGis API For Flex 1.3官方文档和实例的学习啦,不管版本是1.2还是1.3,自己之前对ArcGis Flex API认识比 ...

最新文章

  1. JavaScript 中一句话的思索:this是函数在执行时所处的作用域
  2. python【蓝桥杯vip练习题库】BASIC-26报时助手
  3. pythonChallenge:第1关
  4. DVS/DVR常见的监控名词
  5. FFMPEG源码分析:avformat_open_input()(媒体打开函数)
  6. 骑士php授权,骑士人才系统伪静态设置教程
  7. 【FTP工具】8UFTP工具是我自己比较经常用的,推荐。
  8. 红旗linux打印机安装,红旗linux如何连XP共享的打印机?
  9. 软件公司团队管理方法思考
  10. mui.ajax执行的次数,MUI 中使用 ajax下拉刷新时,数据怎么才能做到累加呢,谢谢...
  11. 事业单位计算机类岗位考试试题,国家机关(事业单位)计算机岗位考试试题
  12. .Net MVC个人笔记
  13. 使用PING测试IP地址
  14. HTML5字体设置重影,Word怎么设置字体重影
  15. Flutter无限循环滑动的PageView
  16. c语言画板,简单的像素画板(C语言编写)
  17. 看盘做短线的10种方法(转)
  18. Ubuntu 20.04有线网卡突然不能用了,无线可以用。
  19. C语言——副作用(side effects)和序列点(sequence points)
  20. html制作心形状图片,HTML5 Canvas实现玫瑰曲线和心形图案的代码实例

热门文章

  1. word文档图片画红线_Word文档怎么在图片内画线?
  2. python给手机发短信_使用 Python 发送短信
  3. 计算机网络课程设计家庭网,家庭无线局域网的组建
  4. 常见基准电压芯片有哪些
  5. Matlab 读取.grd文件
  6. 视频封装格式篇--MP4
  7. Python 之 PyCharm + selenium 163邮箱登录详解
  8. 物联网毕业设计 - 物联网毕设项目分享 有趣的毕设项目(单片机 嵌入式 物联网 stm32)
  9. 接收邮件服务器(pop3,邮件接收(POP3或IMAP)服务器是什么
  10. 对全微分的一点理解。