这题还是比较tricky的,参考了戴方勤的leetcode版本的代码,radix的设计很巧妙,900,400,90,40,9,4的设置让代码简短不少,而且也很容易理解。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
string Integer2Roman(int num) {
const int radix[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
const string symbol[] = {"M", "CM", "D", "CD", "C", "XC",
"L", "XL", "X", "IX", "V", "IV", "I"};
string roman;
for(size_t i=0; num > 0; ++i) {
int count = num/radix[i];
for(; count > 0; --count) roman += symbol[i];
num %= radix[i];
}
return roman;
}
int main (int argc, char* argv[])
{
ifstream file;
string lineBuffer;
file.open(argv[1]);
while (!file.eof()) {
getline(file, lineBuffer);
if (lineBuffer.length() == 0)
continue; //ignore all empty lines
else {
int num;
sscanf(lineBuffer.c_str(), "%d", &num);
cout << Integer2Roman(num) << endl;
}
}
return 0;
}