Advertisement
mr1302

4.6, 4.9

Dec 11th, 2020
671
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.83 KB | None | 0 0
  1. //4.9
  2.  
  3. #include <iostream>
  4. #include <string>
  5. #include <algorithm>
  6. #include <cmath>
  7.  
  8. using namespace std;
  9.  
  10. // не правильно считает на компиляторе g++
  11.  
  12. long long to_dec(string s, int base) { // стандартый перевод из любой сиситемы счисления в 10-ую
  13.     int n = 0;
  14.     reverse(s.begin(), s.end());
  15.     for (int i = s.size() - 1; i >= 0; i--) {
  16.         if (s[i] >= '0' && s[i] <= '9')
  17.             n += (s[i] - 48) * pow(base, i);
  18.         else
  19.             n += (s[i] - 55) * pow(base, i);
  20.     }
  21.     return n;
  22. }
  23.  
  24. string from_dec(long long n, int base) { // стандратный перевод из 10-ой системы счисления в любую
  25.     string s = "";
  26.     while (n > 0) {
  27.         char c = n % base;
  28.         if (c < 10)
  29.             c += 48;
  30.         else
  31.             c += 55;
  32.         s += c;
  33.         n /= base;
  34.     }
  35.     reverse(s.begin(), s.end());
  36.     return s;
  37. }
  38.  
  39. bool check(string s, int base1, int base2) { // проверка введенных данных
  40.     for (int i = 0; i < s.size(); ++i)
  41.         if ((s[i] < '0' || s[i] > '9') && (s[i] < 'A' || s[i] > 'Z'))
  42.             return false;
  43.     if ((base1 > 36 || base2 > 36) || (base1 < 2 || base2 < 2))
  44.         return false;
  45.     for (int i = 0; i < s.size(); ++i) {
  46.         if (base1 > 10) {
  47.             if ((s[i] < 'A' || s[i] >= base1 + 55))
  48.                 return false;
  49.         }
  50.         else {
  51.             if ((s[i] < '0' || s[i] >= base1 + 48))
  52.                 return false;
  53.         }
  54.     }
  55.     return true;
  56. }
  57.  
  58. int main() {
  59.     setlocale(LC_ALL, "rus");
  60.     cout << "Введите число, основание от 2 до 36:\n";
  61.     string s;
  62.     cin >> s;
  63.     int base1 = 0;
  64.     int base2 = 0;
  65.     cout << "Введите его основание:\n";
  66.     cin >> base1;
  67.     cout << "Введите искомое основание, от 2 до 36:\n";
  68.     cin >> base2;
  69.     if (!check(s, base1, base2)) { // проверка данных
  70.         cout << "Вы ввели некорректное число или основание";
  71.         return 0;
  72.     }
  73.     cout << "Переведенное число:\n";
  74.     cout << from_dec(to_dec(s, base1), base2);
  75.     return 0;
  76. }
  77.  
  78. //4.6
  79.  
  80.  
  81. #include <bits/stdc++.h>
  82.  
  83. using namespace std;
  84.  
  85. int Char_to_int(char c){
  86.     switch(c){
  87.         case 'I': return 1;
  88.         case 'V': return 5;
  89.         case 'X': return 10;
  90.         case 'L': return 50;
  91.         case 'C': return 100;
  92.         case 'D': return 500;
  93.         case 'M': return 1000;
  94.         default: return -1;
  95.     }
  96. }
  97.  
  98. bool check(string s){ // эти комбинации не корректны
  99.     if(s == "IVI" ||
  100.        s == "IXI" ||
  101.        s == "XLX" ||
  102.        s == "XCX" ||
  103.        s == "CDC" ||
  104.        s == "CMC")
  105.         return false;
  106.     else
  107.         return true;
  108. }
  109. int Roman_to_int(string& s){ // передаем в фунуцию ссылку на строку
  110.     int ans = 0;
  111.     for(int i = 0; i < s.size() - 1; ++i){
  112.         int temp = Char_to_int(s[i]); // смотрим на текущий и следующий символ с строке
  113.         int n_temp = Char_to_int(s[i + 1]);
  114.         if(n_temp > temp) // если следующее больше, то убавляем текщее иначе прибавляем текушее
  115.             ans += -temp;
  116.         else
  117.             ans += temp;
  118.     }
  119.     //cout << ans;
  120.     ans += Char_to_int(s[s.size() - 1]); // и прибавляем последнее число в любом случае
  121.     return ans;
  122. }
  123.  
  124. bool check_letters(string& s){ // проверяем стостоит ли число из римских цифр
  125.     for(int i = 0; i < s.size(); ++i){
  126.         if(Char_to_int(s[i]) == -1) return false;
  127.     return true;
  128.     }
  129. }
  130.  
  131. bool check_numbers(string& s){ // проверям само число на существование
  132.     if(s.size() > 1)
  133.         for(int i = 0; i < s.size() - 1; ++i){
  134.             int t = Char_to_int(s[i]);
  135.             if(t == 5 || t == 50 || t == 500){ // 5, 50, 500 не могут идти 2 раза подряд
  136.                 if(t == Char_to_int(s[i + 1]))
  137.                     return false;
  138.             }
  139.         }
  140.     if(s.size() > 3)
  141.         for(int i = 0; i < s.size() - 3; ++i){
  142.             int t = Char_to_int(s[i]);
  143.             if(t == 1 || t == 10 || t == 100 || t == 1000){ // 1, 10, 100, 1000 не могут идти более 3 раз подряд
  144.                 if(t == Char_to_int(s[i + 1]) && t == Char_to_int(s[i + 2]) && t == Char_to_int(s[i + 3]))
  145.                     return false;
  146.             }
  147.         }
  148.     if(s.size() > 1)
  149.         for(int i = 1; i < s.size(); ++i){
  150.             int t = Char_to_int(s[i]);
  151.             int n_t = Char_to_int(s[i - 1]);
  152.             if(t > n_t){ // перед большими могут быть только цифры, обозначающие 1 или степени 10
  153.                 if(n_t != 1 && n_t != 10 && n_t != 100 && n_t != 1000)
  154.                     return false;
  155.             }
  156.         }
  157.     if(s.size() > 2) // проверям запрещенные комбинации
  158.         for(int i = 1; i < s.size() - 1; ++i){
  159.             string ss = "";
  160.             ss += s[i - 1];
  161.             ss += s[i];
  162.             ss += s[i + 1];
  163.             if(!check(ss))
  164.                 return false;
  165.         }
  166.     return true;
  167. }
  168.  
  169. int main() {
  170.     setlocale(LC_ALL, "rus");
  171.     string s;
  172.     cout << "Введите римское число\n";
  173.     cin >> s;
  174.     if(!check_letters(s)){
  175.         cout << "Вы ввели некорректное число";
  176.         return 0;
  177.     }
  178.     if(!check_numbers(s)){
  179.         cout << "Вы ввели некорректное число";
  180.         return 0;
  181.     }
  182.     cout << Roman_to_int(s);
  183.     return 0;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement