Guest User

Untitled

a guest
Jul 19th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.20 KB | None | 0 0
  1. #include <iostream>
  2. #include <cctype>
  3. #include <array>
  4. #include <unordered_map>
  5. using namespace std;
  6.  
  7. static unordered_map<char, int> roman_to_dec {
  8. {'I', 1},
  9. {'V', 5},
  10. {'X', 10},
  11. {'L', 50},
  12. {'C', 100},
  13. {'D', 500},
  14. {'M', 1000}
  15. };
  16.  
  17. static unordered_map<int, string> dec_to_roman {
  18. {1, "I"},
  19. {4, "IV"},
  20. {5, "V"},
  21. {9, "IX"},
  22. {10, "X"},
  23. {40, "XL"},
  24. {50, "L"},
  25. {90, "XC"},
  26. {100, "C"},
  27. {400, "CD"},
  28. {500, "D"},
  29. {900, "CM"},
  30. {1000, "M"}
  31. };
  32.  
  33. int roman_decimal(string roman)
  34. {
  35. int dec{0};
  36. int prev{0};
  37. for(auto it = roman.rbegin(); it != roman.rend(); ++it)
  38. {
  39. int curr = roman_to_dec[toupper(*it)];
  40.  
  41. if(curr < prev) dec -= curr;
  42. else dec += curr;
  43.  
  44. prev = curr;
  45. }
  46. cout << roman << ": " << dec << '\n';
  47. return dec;
  48. }
  49.  
  50. string decimal_roman(int k)
  51. {
  52. int copy_of_k = k;
  53. string roman {};
  54.  
  55. array<int, 13> mapped_num {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};
  56.  
  57. while(k > 0)
  58. {
  59. int max = 0;
  60. for(int &i: mapped_num)
  61. {
  62. if(i > k) break;
  63. max = i;
  64. }
  65.  
  66. roman += dec_to_roman[max];
  67. k -= max;
  68. }
  69.  
  70. cout << copy_of_k << ": " << roman << '\n';
  71. return roman;
  72. }
  73.  
  74. int main ()
  75. {
  76. int k = 1203;
  77. string roman_str = decimal_roman(k);
  78. roman_decimal(roman_str);
  79.  
  80. return 0;
  81. }
Add Comment
Please, Sign In to add comment