Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //4.9
- #include <iostream>
- #include <string>
- #include <algorithm>
- #include <cmath>
- using namespace std;
- // не правильно считает на компиляторе g++
- long long to_dec(string s, int base) { // стандартый перевод из любой сиситемы счисления в 10-ую
- int n = 0;
- reverse(s.begin(), s.end());
- for (int i = s.size() - 1; i >= 0; i--) {
- if (s[i] >= '0' && s[i] <= '9')
- n += (s[i] - 48) * pow(base, i);
- else
- n += (s[i] - 55) * pow(base, i);
- }
- return n;
- }
- string from_dec(long long n, int base) { // стандратный перевод из 10-ой системы счисления в любую
- string s = "";
- while (n > 0) {
- char c = n % base;
- if (c < 10)
- c += 48;
- else
- c += 55;
- s += c;
- n /= base;
- }
- reverse(s.begin(), s.end());
- return s;
- }
- bool check(string s, int base1, int base2) { // проверка введенных данных
- for (int i = 0; i < s.size(); ++i)
- if ((s[i] < '0' || s[i] > '9') && (s[i] < 'A' || s[i] > 'Z'))
- return false;
- if ((base1 > 36 || base2 > 36) || (base1 < 2 || base2 < 2))
- return false;
- for (int i = 0; i < s.size(); ++i) {
- if (base1 > 10) {
- if ((s[i] < 'A' || s[i] >= base1 + 55))
- return false;
- }
- else {
- if ((s[i] < '0' || s[i] >= base1 + 48))
- return false;
- }
- }
- return true;
- }
- int main() {
- setlocale(LC_ALL, "rus");
- cout << "Введите число, основание от 2 до 36:\n";
- string s;
- cin >> s;
- int base1 = 0;
- int base2 = 0;
- cout << "Введите его основание:\n";
- cin >> base1;
- cout << "Введите искомое основание, от 2 до 36:\n";
- cin >> base2;
- if (!check(s, base1, base2)) { // проверка данных
- cout << "Вы ввели некорректное число или основание";
- return 0;
- }
- cout << "Переведенное число:\n";
- cout << from_dec(to_dec(s, base1), base2);
- return 0;
- }
- //4.6
- #include <bits/stdc++.h>
- using namespace std;
- int Char_to_int(char c){
- switch(c){
- case 'I': return 1;
- case 'V': return 5;
- case 'X': return 10;
- case 'L': return 50;
- case 'C': return 100;
- case 'D': return 500;
- case 'M': return 1000;
- default: return -1;
- }
- }
- bool check(string s){ // эти комбинации не корректны
- if(s == "IVI" ||
- s == "IXI" ||
- s == "XLX" ||
- s == "XCX" ||
- s == "CDC" ||
- s == "CMC")
- return false;
- else
- return true;
- }
- int Roman_to_int(string& s){ // передаем в фунуцию ссылку на строку
- int ans = 0;
- for(int i = 0; i < s.size() - 1; ++i){
- int temp = Char_to_int(s[i]); // смотрим на текущий и следующий символ с строке
- int n_temp = Char_to_int(s[i + 1]);
- if(n_temp > temp) // если следующее больше, то убавляем текщее иначе прибавляем текушее
- ans += -temp;
- else
- ans += temp;
- }
- //cout << ans;
- ans += Char_to_int(s[s.size() - 1]); // и прибавляем последнее число в любом случае
- return ans;
- }
- bool check_letters(string& s){ // проверяем стостоит ли число из римских цифр
- for(int i = 0; i < s.size(); ++i){
- if(Char_to_int(s[i]) == -1) return false;
- return true;
- }
- }
- bool check_numbers(string& s){ // проверям само число на существование
- if(s.size() > 1)
- for(int i = 0; i < s.size() - 1; ++i){
- int t = Char_to_int(s[i]);
- if(t == 5 || t == 50 || t == 500){ // 5, 50, 500 не могут идти 2 раза подряд
- if(t == Char_to_int(s[i + 1]))
- return false;
- }
- }
- if(s.size() > 3)
- for(int i = 0; i < s.size() - 3; ++i){
- int t = Char_to_int(s[i]);
- if(t == 1 || t == 10 || t == 100 || t == 1000){ // 1, 10, 100, 1000 не могут идти более 3 раз подряд
- if(t == Char_to_int(s[i + 1]) && t == Char_to_int(s[i + 2]) && t == Char_to_int(s[i + 3]))
- return false;
- }
- }
- if(s.size() > 1)
- for(int i = 1; i < s.size(); ++i){
- int t = Char_to_int(s[i]);
- int n_t = Char_to_int(s[i - 1]);
- if(t > n_t){ // перед большими могут быть только цифры, обозначающие 1 или степени 10
- if(n_t != 1 && n_t != 10 && n_t != 100 && n_t != 1000)
- return false;
- }
- }
- if(s.size() > 2) // проверям запрещенные комбинации
- for(int i = 1; i < s.size() - 1; ++i){
- string ss = "";
- ss += s[i - 1];
- ss += s[i];
- ss += s[i + 1];
- if(!check(ss))
- return false;
- }
- return true;
- }
- int main() {
- setlocale(LC_ALL, "rus");
- string s;
- cout << "Введите римское число\n";
- cin >> s;
- if(!check_letters(s)){
- cout << "Вы ввели некорректное число";
- return 0;
- }
- if(!check_numbers(s)){
- cout << "Вы ввели некорректное число";
- return 0;
- }
- cout << Roman_to_int(s);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement