一直对古罗马数字感兴趣,借这个题学习了一下,得出
创新互联建站作为成都网站建设公司,专注重庆网站建设、网站设计,有关成都定制网页设计方案、改版、费用等问题,行业涉及成都地磅秤等多个领域,已为上千家企业服务,得到了客户的尊重与认可。
罗马数转阿拉伯数,算法伪代码:
设输入"MCMLIV"为t,设输出数为sum=0,设最大字符数值为m=0
从右往左遍历t中的字符,比较方便
当遍历字符代表的值c大于等于m时,m=c且sum+=c(对应3III等的情况);否则sum减去该值c(对应4IV,9IX等情况)
比如依次VILMCM依次对应+5, -1, +50, +1000, -100, +1000, 得1954
遍历完输出阿拉伯数sum.
==============
阿拉伯数转罗马数,算法:
视罗马数为十进制,每数位有1,2,3,4,5,6,7,8,9共9种符号(无0)
设全进制单位为a(比如I1, X10, C100, M1000),设半进制单位为b(比如V5, L50, D500),
分别对应固定形式表示法:
1 a; 2 aa; 3 aaa; 4 ab; 5 b; 6 ba; 7 baa; 8 baaa; 9 a(a2)
对于数字2016逐数位分解
2千 得 MM
0百 得 无
1十 得X
6得 VI
合并得MMXVI即2016
原理通了代码实现就非常简单了
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int s = Integer.parseInt(sc.next());
System.out.println(toRome(s));
sc.close();
}
// 阿拉伯数字转罗马数字:
// 把所有小数字在前的组合也作为基本数字,再做一个对应的数值表就可以解决问题了。
// I、V、X、 L、 C、 D、 M
// 1.5、10、50、100、500、1000
private static String toRome(int aNumber){
if(aNumber 1 || aNumber 3999){
return "-1";
}
int[] aArray = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
String[] rArray = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
String rNumber = "";
for(int i=0; iaArray.length; i++){
while(aNumber = aArray[i]){
rNumber += rArray[i];
aNumber -= aArray[i];
}
}
return rNumber;
}
}
Java中有各国的文字段,正则表达式这玩意专门匹配各国语言的~
比如匹配汉字:
Pattern p=Pattern.Compile("[\u4e00-\u9fa5]");而匹配罗马数字的是:
^[1-9]\d*$
//匹配正整数
^-[1-9]\d*$
//匹配负整数
^-?[1-9]\d*$
//匹配整数
^[1-9]\d*|0$
//匹配非负整数(正整数 + 0)
^-[1-9]\d*|0$
//匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$
//匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$
//匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
//匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
//匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
//匹配非正浮点数(负浮点数 + 0)