题目:罗马数字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 };