fork(3) download
  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4.  
  5. int parse(char digit) {
  6. int result;
  7. switch(digit) {
  8. case 'I': result = 1; break;
  9. case 'V': result = 5; break;
  10. case 'X': result = 10; break;
  11. case 'L': result = 50; break;
  12. case 'C': result = 100; break;
  13. case 'D': result = 500; break;
  14. case 'M': result = 1000; break;
  15. default: result = 0;
  16. }
  17. return result;
  18. }
  19.  
  20. int parse(char *number) {
  21. int result = 0, previous = parse(number[0]), current;
  22. for(int i = 1; (current = parse(number[i])) != 0; i++) {
  23. result += previous < current ? -previous : previous;
  24. previous = current;
  25. }
  26. result += previous;
  27. return result;
  28. }
  29.  
  30. void print(int number) {
  31. char result[1000]{'\0'};
  32. const int values[] = { 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000 };
  33. const char *symbols[] = { "I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M" };
  34. int counter = sizeof(symbols) / sizeof(symbols[0]) - 1; // array length
  35. while(counter >= 0) {
  36. while(number >= values[counter]) {
  37. number -= values[counter];
  38. strcat(result, symbols[counter]);
  39. }
  40. counter--;
  41. }
  42. cout << result << endl;
  43. }
  44.  
  45. int main() {
  46. char line[1000];
  47. cin >> line;
  48. char *a = strtok(line, "+");
  49. char *b = strtok(NULL, "");
  50. print(parse(a) + parse(b));
  51. return 0;
  52. }
Success #stdin #stdout 0s 3464KB
stdin
XX+X
stdout
XXX