#include<iostream>
#include<sstream>
#include<exception>
std::string decimal_to_roman (unsigned num) {
std::stringstream ss {};
while (num>0) {
if (num>10000)
throw std::range_error (
"ERROR: decimal_to_roman (unsigned num) [num is out of
range]");
else if (num==10000) { ss<<"[M]"; num-=10000; }
else if (num>=9000) { ss<<"[CM]"; num-=9000; }
else if (num>=5000) { ss<<"[D]"; num-=5000; }
else if (num>=4000) { ss<<"[CD]"; num-=4000; }
else if (num>=1000) { ss<<"M"; num-=1000; }
else if (num>=900) { ss<<"CM"; num-=900; }
else if (num>=500) { ss<<"D"; num-=500; }
else if (num>=400) { ss<<"CD"; num-=400; }
else if (num>=100) { ss<<"C"; num-=100; }
else if (num>=90) { ss<<"XC"; num-=90; }
else if (num>=50) { ss<<"L"; num-=50; }
else if (num>=40) { ss<<"XL"; num-=40; }
else if (num>=10) { ss<<"X"; num-=10; }
else if (num==9) { ss<<"IX"; num-=9; }
else if (num>=5) { ss<<"V"; num-=5; }
else if (num==4) { ss<<"IV"; num-=4; }
else if (num>=1) { ss<<"I"; num-=1; }
}
return ss.str();
}
int main (void) {
for (unsigned n=1; n<=10000; ++n) {
try {
std::cout << n << "\t = " <<
decimal_to_roman(n) << std::endl;
}
catch (std::range_error& e) {
std::cerr<<e.what()<<std::endl;
break;
}
}
}