【蓝桥杯练习】003 罗马数字转十进制【暴力】

请编写程序,由用户输入若干个罗马数字串,程序输出对应的十 进制表示。

输入格式:第一行是整数 n, 表示接下来有 n 个罗马数字 (n<100)。以后每行一个 罗马数字。罗马数字大小不超过 999。要求程序输出 n 行,就是罗马数字对应的十进制数据。

例如:用户输入:

3 
LXXX 
XCIII 
DCCII 

则程序应该输出:

80 
93 
702  

题目的难点在于:小单位在大单位左边这种情况,而且还不是所有的小单位放到大单位左边都成立。比如 I 在 C100 左边,就不成立。

突破点:I 在左边,数值 -1I 在右边,数值 +1

如果情况比较少,并非成千上万,我们可以使用枚举法解决.

import java.util.Scanner;
public class Main{
 public static int check(String s) {
   int sum = 0;
   char c;
   for(int i=0; i<s.length(); ++i) {
     c = s.charAt(i);
     if(c == 'I')  sum += 1;
     if(c == 'V')  sum += 5;
     if(c == 'X')  sum += 10;
     if(c == 'L')  sum += 50;
     if(c == 'C')  sum += 100;
     if(c == 'D')  sum += 500;
     if(c == 'M')  sum += 1000;
   }
   return sum;
 }
 public static void main(String[] args) {
   Scanner scanner = new Scanner(System.in);
   String s1 = scanner.next();
   System.out.println(check(s1));
 }
}
输出:1316

仅仅是普通的写法,还不行,可能存在 IVIX…,这种 I 在前的组合。

怎么办?第一感觉,肯定是在check()中处理 I 在前这种情况下sum的值减多少。

这里我们不用,只需要在循环退出后,对s检查,如果存在那样的组合,那么我们把sum的值减去,所以check()函数改造成

public static int check(String s) {
    int sum = 0;
    char c;
    for(int i=0; i<s.length(); ++i) {
      c = s.charAt(i);
      if(c == 'I')  sum += 1;
      if(c == 'V')  sum += 5;
      if(c == 'X')  sum += 10;
      if(c == 'L')  sum += 50;
      if(c == 'C')  sum += 100;
      if(c == 'D')  sum += 500;
      if(c == 'M')  sum += 1000;
    }
    if(s.indexOf("IV") >= 0) { sum -= 2; }
    if(s.indexOf("IX") >= 0) { sum -= 2; }
    if(s.indexOf("IL") >= 0) { sum -= 2; }
    if(s.indexOf("IC") >= 0) { sum -= 2; }
    if(s.indexOf("ID") >= 0) { sum -= 2; }
    if(s.indexOf("IM") >= 0) { sum -= 2; }
    return sum;
}

你可能感兴趣的:(【蓝桥杯练习】003 罗马数字转十进制【暴力】)