罗马数字转换 java_JAVA 罗马数字转换成公历年
展开全部
已经经过验证,可以实现,但输入数字不能有空格
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 罗马数字转换成公历年相关推荐
- 金额转换java_java金额转换
像商品价格,订单,结算都会涉及到一些金额的问题,为了避免精度丢失通常会做一些处理,常规的系统中金额一般精确到小数点后两位,也就是分: 这样数据库在设计的时候金额就直接存储整型数据类型,前端可以将金额X ...
- 计蒜客挑战难题:整数转换成罗马数字
给定一个整数num,( 1<=num<=3999),将整数转换成罗马数字. 如1,2,3,4,5对应的罗马数字分别位I,II,III,IV,V等. 格式: 第一行输入一个整数,接下来输出对 ...
- JavaScript练习 - 数字转换成罗马数字
摘要:以下数字转换成罗马数字的方法估计是最傻的办法了. 一.思路 (1)把数字拆分,把每个数字都存入数组arr中: (2)将数组arr中非0的数字存入新的数组arr1中: (3)把数组arr1中的每个 ...
- 整型数字转换成罗马数字
版权声明:本文为博主原创文章,转载请注明出处. 个人博客地址:https://yangyuanlin.club 欢迎来踩~~~~ integer to roman Given an integer, ...
- 【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 ...
- 罗马数字向数字的转换
Roman to Integer: 罗马数字向数字的转换: 这个算法你只要想明白用一个字典去存储罗马数字就可以了,然后通过输入的罗马数字从字典中拿值就欧克了.我就不多说了 代码如下: class So ...
- pdf转ppt怎么转换,pdf转换ppt的方法分享
工作中为了方便我们在对文件的查看和应用,都会遇到过文件格式的相互转换吧,如果在工作中碰到了PDF文件转换成PPT文件的时候,我们要用什么样的方式转换最容易而又不出错呢,下面小编为大家分享一下小编常用的 ...
- PHP是弱类型语言,自动转换,强制转换
强制转换: (int) - 转换成整型 (bool) - 转换.成布尔型 (float) - 转换成浮点型 (string) - 转换成字符串 (array) - 转换成数组 (object) - 转 ...
- Java数据类型转换(自动转换和强制转换)
数据类型的转换,分为自动转换和强制转换.自动转换是程序在执行过程中"悄然"进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换:强制类型转换则必须在代码中声明,转 ...
- .NET代码混淆学习和解决视频批量转换中.wmv转换出错问题
现在开始对自己一天的工作进行一下大致总结,上午主要是研究ArcGis API For Flex 1.3官方文档和实例的学习啦,不管版本是1.2还是1.3,自己之前对ArcGis Flex API认识比 ...
最新文章
- JavaScript 中一句话的思索:this是函数在执行时所处的作用域
- python【蓝桥杯vip练习题库】BASIC-26报时助手
- pythonChallenge:第1关
- DVS/DVR常见的监控名词
- FFMPEG源码分析:avformat_open_input()(媒体打开函数)
- 骑士php授权,骑士人才系统伪静态设置教程
- 【FTP工具】8UFTP工具是我自己比较经常用的,推荐。
- 红旗linux打印机安装,红旗linux如何连XP共享的打印机?
- 软件公司团队管理方法思考
- mui.ajax执行的次数,MUI 中使用 ajax下拉刷新时,数据怎么才能做到累加呢,谢谢...
- 事业单位计算机类岗位考试试题,国家机关(事业单位)计算机岗位考试试题
- .Net MVC个人笔记
- 使用PING测试IP地址
- HTML5字体设置重影,Word怎么设置字体重影
- Flutter无限循环滑动的PageView
- c语言画板,简单的像素画板(C语言编写)
- 看盘做短线的10种方法(转)
- Ubuntu 20.04有线网卡突然不能用了,无线可以用。
- C语言——副作用(side effects)和序列点(sequence points)
- html制作心形状图片,HTML5 Canvas实现玫瑰曲线和心形图案的代码实例