【LeetCode】012 013 Roman Integer

题目:罗马数字string和自然整数的N相互转换,范围在1-3999之间

 

只知道10以下的罗马数字的规则,没办法赶紧去百度了一下。没办法看了一会才看懂,幸好只是要求在4000以下。

http://baike.baidu.com/link?url=f5H-LirOQteTWmhQXoghRvl9f8aJlm4sHDVvTzY87XaDiiN06GasOCuETJf3mb4V4KgIubN-Ad7-atNDz4RXJK

整数

1

5

10

50

100

500

1000

罗马数

I

V

X

L

C

D

M

 

 

规则:

1、相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;

2、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;

3、小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;

4、正常使用时,连写的数字重复不得超过三次。(表盘上的四点钟“IIII”例外)

5、在一个数的上面画一条横线,表示这个数扩大1000倍。


先做的将整数转换成罗马数字,只是将N拆成1000,900,500,400,100,90,50,40,10,9,5,4,1这样的组合即可。

罗马数字转换成整数的时候,也是需要从string中不断的读取字符分情况判断。

 

代码如下:写法很脑残,等有时间看看别人的代码。

 1 class Solution {
 2 public:
 3     string intToRoman(int num) {
 4         string ans = "";
 5         int base = 1000, n, res;
 6         // 千位
 7         n = num/base; res = num%base; num = res; base/=10;
 8         while(n--) ans += "M";
 9 
10         // 百位
11         n = num/base; res = num%base; num = res; base/=10;
12         if(n==9) ans += "CM";
13         else if(n>=5)
14         {
15             ans += "D";
16             while(n!=5)
17             {
18                 ans += "C";
19                 n--;
20             }
21         }
22         else if(n==4) ans += "CD";
23         else
24         {
25             while(n--) ans += "C";
26         }
27 
28         // 十位
29         n = num/base; res = num%base; num = res; base/=10;
30         if(n==9) ans += "XC";
31         else if(n>=5)
32         {
33             ans += "L";
34             while(n!=5)
35             {
36                 ans += "X";
37                 n--;
38             }
39         }
40         else if(n==4) ans += "XL";
41         else
42         {
43             while(n--) ans += "X";
44         }
45 
46         // 个位
47         n = num;
48         if(n==9) ans += "IX";
49         else if(n>=5)
50         {
51             ans += "V";
52             while(n!=5)
53             {
54                 ans += "I";
55                 n--;
56             }
57         }
58         else if(n==4) ans += "IV";
59         else
60         {
61             while(n--) ans += "I";
62         }
63         return ans;        
64     }
65 };

 

  1 class Solution {
  2 public:
  3     int romanToInt(string s) {
  4         int ans = 0, len = s.size(), i = 0;
  5         string str;
  6 
  7         // 有千位数
  8         while(i<len && s[i] == 'M')
  9         {
 10             ans += 1000;
 11             i++;
 12         }
 13         //cout << "i: " << i << "  ans: " << ans << endl;
 14 
 15         // 百位
 16         if(s[i] == 'D')
 17         {
 18             ans += 500;
 19             i++;
 20             while(i<len && s[i]=='C')
 21             {
 22                 ans += 100;
 23                 i++;
 24             }
 25             //cout << ans << endl;
 26         }
 27         if(s[i] == 'C')
 28         {
 29             if(i<len && s[i+1] == 'M')
 30             {
 31                 ans += 900;
 32                 i++; i++;
 33             }
 34             else if(i<len && s[i+1] == 'D')
 35             {
 36                 ans += 400;
 37                 i++; i++;
 38             }
 39             else
 40             {
 41                 while(i<len && s[i]=='C')
 42                 {
 43                     ans += 100;
 44                     i++;
 45                 }
 46             }
 47             //cout << ans << endl;
 48         }
 49 
 50         // 十位
 51         if(s[i] == 'L')
 52         {
 53             ans += 50;
 54             i++;
 55             while(i<len && s[i]=='X')
 56             {
 57                 ans += 10;
 58                 i++;
 59             }
 60             //cout << ans << endl;
 61         }
 62         if(s[i] == 'X')
 63         {
 64             if(i<len && s[i+1] == 'C')
 65             {
 66                 ans += 90;
 67                 i++; i++;
 68             }
 69             else if(i<len && s[i+1] == 'L')
 70             {
 71                 ans += 40;
 72                 i++; i++;
 73             }
 74             else
 75             {
 76                 while(i<len && s[i]=='X')
 77                 {
 78                     ans += 10;
 79                     i++;
 80                 }
 81             }
 82             //cout << ans << endl;
 83         }
 84 
 85         //个位
 86         if(s[i] == 'V')
 87         {
 88             ans += 5;
 89             i++;
 90             while(i<len && s[i]=='I')
 91             {
 92                 ans += 1;
 93                 i++;
 94             }
 95             //cout << ans << endl;
 96         }
 97         if(s[i] == 'I')
 98         {
 99             if(i<len && s[i+1] == 'X')
100             {
101                 ans += 9;
102                 i++; i++;
103             }
104             else if(i<len && s[i+1] == 'V')
105             {
106                 ans += 4;
107                 i++; i++;
108             }
109             else
110             {
111                 while(i<len && s[i]=='I')
112                 {
113                     ans += 1;
114                     i++;
115                 }
116             }
117             //cout << ans << endl;
118         }
119         return ans;
120     }
121 };

 

posted @ 2015-04-27 10:18  二喵de喵  阅读(180)  评论(0编辑  收藏  举报