罗马数字转十进制 古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候, 现在看起来简直不能忍受,所以在现代很少使用了。

来源:互联网 发布:谁有千百鲁最新域名 编辑:程序博客网 时间:2024/05/16 07:29
/* 罗马数字转十进制    古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,    现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,    而是因为一个宗教的原因,当时的宗教禁止在数字中出现0的概念!    罗马数字的表示主要依赖以下几个基本符号:    I  1    V  5    X  10    L  50    C  100    D  500    M  1000    这里,我们只介绍一下1000以内的数字的表示法。    单个符号重复多少次,就表示多少倍。最多重复3次。        比如:CCC表示300  XX表示20,    但150并不用LLL表示,这个规则仅适用于I X C M。    如果相邻级别的大单位在右,小单位在左,表示大单位中扣除小单位。        比如:IX表示9  IV表示4  XL表示40 更多的示例参见下表,你找到规律了吗?I,1 II,2III,3IV,4V,5VI,6VII,7VIII,8IX,9 X,10XI,11XII,12XIII,13XIV,14XV,15XVI,16XVII,17XVIII,18XIX,19XX,20XXI,21XXII,22XXIX,29XXX,30XXXIV,34XXXV,35XXXIX,39XL,40L,50LI,51LV,55LX,60LXV,65LXXX,80XC,90XCIII,93XCV,95XCVIII,98XCIX,99C,100CC,200CCC,300CD,400D,500DC,600DCC,700DCCC,800CM,900CMXCIX,999    本题目的要求是:请编写程序,由用户输入若干个罗马数字串,程序输出对应的十进制表示。    输入格式是:第一行是整数n,表示接下来有n个罗马数字(n<100)。    以后每行一个罗马数字。    罗马数字大小不超过999。    要求程序输出n行,就是罗马数字对应的十进制数据。    例如,用户输入:3LXXXXCIIIDCCII    则程序应该输出:8093702    注意:    请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!    在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。 */import java.util.Scanner;public class 罗马数字转十进制 {public static int getNum(char c){switch(c){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;}return 0;}public static int format(String s){int sum = 0;// 总和for(int i=0;i<s.length();i++){int a,b;// 取得两个相邻的两个值a = getNum(s.charAt(i));if(i+1<s.length()){b = getNum(s.charAt(i+1));}else{b = 0;}if(a<b){// 对比两个值sum += b-a;// 前小后大时,sum=大-小i++;// 这里的i++和(for里的i++) i 会后移两位 ,再次进行}else{// 前大后小,或者相等时, sum = 前大元素  , 上边的(for里的i++) i 会后移一位sum += a;}}return sum;}public static void main(String[] args){Scanner scan = new Scanner(System.in);System.out.println("输入整数n,表示接下来有n个罗马数字(n<100)");int n = scan.nextInt();String[] s = new String[n];scan.nextLine();for(int i=0;i<n;i++){// 输入数据s[i] = scan.nextLine();}for(int i=0;i<s.length;i++){// 格式化并输出System.out.println(format(s[i]));}}}
方法二:(用Map添加对应数字)
import java.util.Scanner;import java.util.HashMap;public class 罗马数字转十进制2 {@SuppressWarnings("serial")static HashMap<Character,Integer> Map = new HashMap<Character,Integer>(){{put('I',1);put('V',5);put('X',10);put('L',50);put('C',100);put('D',500);put('M',1000);}};public static int format(String s){int sum = 0;// 总和int i=0;while(i<s.length()){int a = Map.get(s.charAt(i));int b ;if(i+1<s.length()){b = Map.get(s.charAt(i+1));}else{b = 0;}if(a<b){sum += b - a;i += 2;}else{sum += a;i++;}}return sum;}public static void main(String[] args){Scanner scan = new Scanner(System.in);System.out.println("输入整数n,表示接下来有n个罗马数字(n<100)");int n = scan.nextInt();String[] s = new String[n];scan.nextLine();for(int i=0;i<n;i++){// 输入数据s[i] = scan.nextLine();}for(int i=0;i<s.length;i++){// 格式化并输出System.out.println(format(s[i]));}}}


运行结果:
输入整数n,表示接下来有n个罗马数字(n<100)3LXXXXCIIIDCCII8093702

原创粉丝点击