题目链接:https://leetcode.com/problems/roman-to-integer/
题目的意思很的简单:Given a roman numeral, convert it to an integer.给一个罗马数字,转化为阿拉伯数字。数字范围比较小 1~3999。
首先百度了一下罗马数字的命名规则:http://baike.baidu.com/link?url=4_M7yJG5SIDYU7mzwY-XI-3lirwJkGmoANH-5N5XBpeNufRMQmfu_yZZFEQ3xaKy2hU0nyKc0H4VGj0AJGILv_
写的比较详细。不在赘述。
然后,有了解了一下阿拉伯数字转化为罗马数字的方法。直接体现在Code 上吧!
找了一道题目练习了一下:Toj 3021
总体上比较简单。
Code:
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
using namespace std;
class Solution {
public:
map<char, int> hash;
void Init(){
hash['I'] = 1; hash['V'] = 5;
hash['X'] = 10; hash['L'] = 50;
hash['C'] = 100; hash['D'] = 500;
hash['M'] = 1000;
}
const int nums[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
const string str[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
int romanToInt(string s) {
Init();
int len = s.size();
int ans = 0;
for(int i = 0; i < len; ++ i){
if(i == len - 1 || hash[s[i]] >= hash[s[i + 1]]) ans += hash[s[i]];
else ans -= hash[s[i]];
}
return ans;
}
string intToRoman(int num){
string ans = "";
int i = 0;
while(num){
while(num >= nums[i]){
ans += str[i];
num -= nums[i];
}
i ++ ;
}
return ans;
}
};
int main()
{
int n, k = 1;
while(cin >> n && n){
string str;
int ans = 0;
while(n --){
cin >> str;
ans += romanToInt(str);
}
// cout << "ans = " << ans << endl;
cout << "Case " << intToRoman(k ++) << ": " << intToRoman(ans) << endl;
}
return 0;
}