Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Никитааааа
0 / 0 / 0
Регистрация: 26.02.2014
Сообщений: 18
#1

Программа перевод чисел из арабской систеиы счисления в римскую - C++

12.03.2014, 14:07. Просмотров 989. Ответов 11
Метки нет (Все метки)

Перевести заданное целое число в систему римского счисления (1 - I, 5 - V, 10 - X, 50 - L, 100 - C, 500 - D, 1000 - M)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2014, 14:07
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Программа перевод чисел из арабской систеиы счисления в римскую (C++):

Перевод с арабской на римскую сисстему счисления - C++
Подскажите как сделать перевод с арабских на римские числа по принципу этой программы #include <string.h> #include <stdio.h> ...

Перевод с арабской на римскую сс и наоборот - C++
не могу составить программу перевода с арабской на римскую сс. Помогите плиз.

Перевод из арабской сис. в римскую! - C++
Да, я видел уже существующие темы на этот вопрос. Но нигде нету перевода чисел 10 000+ везде до 1000. Так вот проблема в том что 10 000 =...

Перевод с арабской на римскую сс и наоборот - C++
Программа работает на половину, переводит только с римских чисел на арабские, помогите доделать что бы переводила и с арабских на римские ...

Перевод чисел из файла в римскую систему счисления - C++
Во входном файле in.txt заданы целые числа в диапазоне от 1 до 3999, например: 112 24 9 3517 438 56 Вывести те же числа в...

Написать программу, какая переводит числа с арабской системы в римскую - C++
Задание: Написать программу, какая переводит числа с арабской системы в римскую. Сам текст программы уже дали в задании, это как...

11
Ilot
Эксперт С++
1826 / 1184 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
12.03.2014, 14:15 #2
Перевод арабских чисел в римские
0
John Prick
831 / 764 / 154
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
12.03.2014, 15:40 #3
Вариант с большим количеством ада.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
Перевести заданное целое число в систему римского счисления
(1 - I, 5 - V, 10 - X, 50 - L, 100 - C, 500 - D, 1000 - M)
*/
 
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <ctime>
#include <string>
#include <vector>
#include <functional>
 
template <class T, class U>
class get_member_ref
{
public:
    typedef const U & result_type;
    typedef const T & argument_type;
    get_member_ref(const U T::*const PMem) : _pMem(PMem) {}
    result_type operator()(argument_type Obj) const { return Obj.*_pMem; }
private:
    const U T::*const _pMem;
};
 
template <class T, class U>
get_member_ref<T, U> get_mem_ref(const U T::*const PMem)
{
    return get_member_ref<T, U>(PMem);
}
 
template <class Func1, class Func2>
class unary_compose: public std::unary_function<typename Func2::argument_type, typename Func1::result_type>
{
public:
    unary_compose(const Func1 & F1, const Func2 & F2) : _f1(F1), _f2(F2) {}
    result_type operator()(argument_type Obj) const
    {
        return _f1(_f2(Obj));
    }
private:
    Func1 _f1;
    Func2 _f2;
};
 
template <class Func1, class Func2>
unary_compose<Func1, Func2> compose1(const Func1 & F1, const Func2 & F2)
{
    return unary_compose<Func1, Func2>(F1, F2);
}
 
struct Arab2RomeNode
{
    unsigned int arab;
    char rome;
};
 
Arab2RomeNode nodes[] = {
    { 1, 'I' },
    { 10, 'X' },
    { 100, 'C' },
    { 1000, 'M' },
    { 5, 'V' },
    { 50, 'L' },
    { 500, 'D' }
};
 
bool operator<(Arab2RomeNode N1, Arab2RomeNode N2) { return (N1.arab < N2.arab); }
Arab2RomeNode * nodes_begin(void) { return nodes; }
Arab2RomeNode * nodes_end(void) { return nodes + sizeof(nodes)/sizeof(nodes[0]); }
 
char rome_next_exponent(char symbol)
{
    Arab2RomeNode * node = std::find_if(nodes_begin(), nodes_end(),
        compose1(std::bind2nd(std::equal_to<char>(), symbol), get_mem_ref(&Arab2RomeNode::rome)));
    if (node == nodes_end())
    {
        std::cout << "Ошибка алгоритма\n";
        return '?';
    }
    return (*(node + 2)).rome;
}
 
void raise_exponent(std::string & rome_digit)
{
    std::transform(rome_digit.begin(), rome_digit.end(), rome_digit.begin(), rome_next_exponent);
}
 
std::string arab2rome(unsigned int arab)
{
    std::string rome;
    if (arab > 9)
    {
        std::cout << "Ошибка алгоритма\n";
        return rome;
    }
    if (arab == 0)
        return rome;
 
    Arab2RomeNode * node = (arab < (nodes_begin() + 1)->arab) ? nodes_begin() : nodes_begin() + 1;
    if (arab == (*(node + 1)).arab - 1)
    {
        rome.push_back(nodes_begin()->rome);
        rome.push_back((node + 1)->rome);
    } else
    {
        rome.push_back(node->rome);
        arab -= node->arab;
        while (arab > 0)
        {
            rome.push_back(nodes_begin()->rome);
            --arab;
        }
    }
    return rome;
}
 
class Arab2Rome
{
public:
    Arab2Rome(std::vector<std::string> & rd) : m_rome_digits(rd) {}
    void operator()(unsigned int arab_digit)
    {
        std::for_each(m_rome_digits.begin(), m_rome_digits.end(), raise_exponent);
        m_rome_digits.push_back(arab2rome(arab_digit));
    }
private:
    std::vector<std::string> & m_rome_digits;
};
 
int main(void)
{
    setlocale(0, "rus");
    srand(static_cast<unsigned int>(time(NULL)));
 
    std::sort(nodes_begin(), nodes_end());
 
    unsigned int arab = rand() % 5000;
    std::vector<unsigned int> digits;
    unsigned int arab_copy = arab;
    while (arab_copy > 0)
    {
        digits.push_back(arab_copy % 10);
        arab_copy = arab_copy / 10;
    }
    std::reverse(digits.begin(), digits.end());
 
    std::vector<std::string> rome_digits;
    std::for_each(digits.begin(), digits.end(), Arab2Rome(rome_digits));
 
    std::cout << "Число: " << arab << '\n';
    std::cout << "Римское число: ";
    std::copy(rome_digits.begin(), rome_digits.end(), std::ostream_iterator<std::string>(std::cout, ""));
    std::cout << std::endl;
    system("pause");
    return 0;
}
2
Ilot
Эксперт С++
1826 / 1184 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
12.03.2014, 15:58 #4
В объявлении класса unary_compose забыли:
C++
1
2
    typedef typename Func1::result_type result_type;
typedef typename Func2::argument_type argument_type;
А также заголовочник:
C++
1
#include <iterator>
А чему равно число 4500 в римской системе?
И реализация конечно кошмар
0
John Prick
831 / 764 / 154
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
12.03.2014, 16:03 #5
Цитата Сообщение от Ilot Посмотреть сообщение
В объявлении класса unary_compose забыли:
C++
1
2
typedef typename Func1::result_type result_type;
typedef typename Func2::argument_type argument_type;
Не забыли. Они наследуются от std::unary_function.

Цитата Сообщение от Ilot Посмотреть сообщение
А также заголовочник:
C++
1
#include <iterator>
Ага. Но 2008я студия не ругается, а я всё время забываю его.
Цитата Сообщение от Ilot Посмотреть сообщение
А чему равно число 4500 в римской системе?
Будет ММММD. Хотя конечно не правильно это. Надо до 4000 делать.
Цитата Сообщение от Ilot Посмотреть сообщение
И реализация конечно кошмар
Да лан. Что тут кошмарного? Всё прозрачно.
0
Ilot
Эксперт С++
1826 / 1184 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
12.03.2014, 16:07 #6
Цитата Сообщение от John Prick Посмотреть сообщение
Да лан. Что тут кошмарного? Всё прозрачно.
Просто для сравнения посмотрите на эту реализацию
Цитата Сообщение от John Prick Посмотреть сообщение
Не забыли. Они наследуются от std::unary_function.
Хм... возможно, однако ваш вариант у меня не компилится, так как стандарт запрещает использование определенного внутри другого класса типа без спецификатора typename. Т.е. здесь можно сделать так:
C++
1
2
3
4
    typename Func1::result_type operator()(typename Func2::argument_type Obj) const
    {
        return _f1(_f2(Obj));
    }
0
John Prick
831 / 764 / 154
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
12.03.2014, 16:09 #7
Ilot, да я ради шутки этот код выложил. Не парьтесь.
Цитата Сообщение от Ilot Посмотреть сообщение
ваш вариант у меня не компилится
Какой у вас компилятор?
0
Ilot
Эксперт С++
1826 / 1184 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
12.03.2014, 16:12 #8
Цитата Сообщение от John Prick Посмотреть сообщение
Какой у вас компилятор?
GCC
0
John Prick
831 / 764 / 154
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
12.03.2014, 16:39 #9
Сейчас под рукой его нет. Дома проверю и исправлю.

Добавлено через 22 минуты
Проверил. Ну да, требует чтобы эти типы были вложены в unary_compose. Правда, я так и не нашёл реализацию unary_function в инклудах для DevC++, хотя по стандарту оно должно быть в <functional>.
0
Ilot
Эксперт С++
1826 / 1184 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
12.03.2014, 16:45 #10
Цитата Сообщение от John Prick Посмотреть сообщение
Правда, я так и не нашёл реализацию unary_function в инклудах для DevC++, хотя по стандарту оно должно быть в <functional>
<stl_function>
0
John Prick
831 / 764 / 154
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
12.03.2014, 16:48 #11
Цитата Сообщение от Ilot Посмотреть сообщение
<stl_function>
C++
1
2
3
4
5
6
7
8
9
  template<typename _Arg, typename _Result>
    struct unary_function
    {
      /// @c argument_type is the type of the argument
      typedef _Arg  argument_type;   
 
      /// @c result_type is the return type
      typedef _Result   result_type;  
    };
И что же тогда? Почему не компилирует? Ведь, по сути, этот класс (unary_function) только для этих тайпдефов и нужен.
0
zarko97
279 / 39 / 0
Регистрация: 11.10.2015
Сообщений: 405
22.06.2017, 00:43 #12
как вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// 3198
//   |
//   V
// 3000 100 90 8
//   |
//   V
// MMMCXCVIII
std::map<std::size_t, std::string> initMap()
{
    std::map<std::size_t, std::string> romeDigits;
    romeDigits[1] = "I";
    romeDigits[2] = "II";
    romeDigits[3] = "III"; 
    romeDigits[4] = "IV";
    romeDigits[5] = "V";
    romeDigits[6] = "VI";
    romeDigits[7] = "VII";
    romeDigits[8] = "VIII";
    romeDigits[9] = "IX";
    romeDigits[10] = "X";
    romeDigits[20] = "XX";
    romeDigits[30] = "XXX";
    romeDigits[40] = "XL";
    romeDigits[50] = "L";
    romeDigits[60] = "LX";
    romeDigits[70] = "LXX";
    romeDigits[80] = "LXXX";
    romeDigits[90] = "XC";
    romeDigits[100] = "C";
    romeDigits[200] = "CC";
    romeDigits[300] = "CCC";
    romeDigits[400] = "CD";
    romeDigits[500] = "D";
    romeDigits[600] = "DC";
    romeDigits[700] = "DCC";
    romeDigits[800] = "DCCC";
    romeDigits[900] = "CM";
    romeDigits[1000] = "M";
    
    return std::move(romeDigits);
}
 
std::set<std::size_t> initSet(std::string&& s)
{
    std::set<std::size_t> numb;
    for (std::size_t i = 0; i < s.size() - 1; ++i)
        numb.insert(std::stoi(s[i] + std::string(s.size() - i - 1, '0')));
    if (s.back() != '0')
        numb.insert(s.back() - '0');
 
    return std::move(numb);
}
 
std::string toRomeSequence(std::string&& s, std::set<std::size_t> const & numb, std::map<std::size_t, std::string> const & digits)
{
    std::ostringstream os;
    for (auto const & val : numb) {
        const auto itr = std::prev(digits.upper_bound(val));
        std::fill_n(std::ostream_iterator<std::string>(os), val / itr->first, itr->second);
    }
    return os.str();
}
 
bool isNumb(std::string&& s)
{
    return std::all_of(s.begin(), s.end(), std::isdigit) && s.front() != '0';
}
Добавлено через 4 минуты
John Prick, кайф сплошной

Добавлено через 4 минуты
Цитата Сообщение от John Prick Посмотреть сообщение
Будет ММММD. Хотя конечно не правильно это
больше 3 одинаковых нельзя?
0
22.06.2017, 00:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2017, 00:43
Привет! Вот еще темы с ответами:

Перевод чисел из двоичной системы счисления в систему счисления кратной степеням двойки и обратно - C++
Нужно две программы, одна реализует перевод чисел из двоичной системы счисления в систему счисления кратной степеням двойки, а другая...

Перевод чисел из 16 системы счисления в 2 систему счисления - C++
Помогите составить программу для перевод чисел из 16 с/c в 2 c/c при условии,что программ может переводить и дробные числа.

задача на римскую систему счисления - C++
Ввести число римскими цифрами (менее 4000 в арабской записи), учитывая следующие обозначения: I - 1, V - 5, X - 10, L - 50, C - 100, D -...

Преобразование в римскую систему счисления - C++
Нужно написать функцию для преобразования целого десятичного числа (от 1 до 3999) в римскую систему исчисления. ВАЖНО! Нельзя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru