Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
Другие темы раздела
C++ как удалить элемент из связного списка http://www.cyberforum.ru/cpp-beginners/thread538324.html
//Разработать программу поиска в векторе значений, лежащих в диапазоне, введённом с клавиатуры. //Удалить все элементы, не принадлежащие диапазону. Элементы вектора вводятся с клавиатуры и //хранятся в связанном списке. в целом задание простое, только вот у меня вызывает затруднение то, как удалить ненужные элементы из связного списка без нарушения его целостности. то есть я имею в виду если...
C++ найти индекс элемента массива ,имеющего минимальную сумму цифр 1)найти индекс элемента массива ,имеющего минимальную сумму цифр 2)выяснить сумма каких элементов бльше, тех что првее или левее элемнта из задания 1. Моя программа выдает ошибку. может вы сможете подсказать мне что не так и кк это исправить #include <iostream> #include <fstream> #include <iomanip> using namespace std; const int N=10; http://www.cyberforum.ru/cpp-beginners/thread538322.html
Code::Blocks 10.05. Windows. No such or directory. C++
Ребята, здравствуйте... Начал искать себе компилятор для программирования с среде Windows. Свой выбор остановил на IDE Code::Blocks. Вроде все при нем, но в процессе начальной диагностики и ознакомления уже наткнулся на серьезные проблемы... Короче, по каким-то загадочным причинам компилятор не видит файлов в процессе компиляции. Ну, он их видит, но не знает где они лежат. Если прописать...
ассиметричные алгоритмы шифрования C++
у меня такая проблема.. не могу разобраться с ассиметричными алгоритмами шифрования, а точнее с RSA кому не трудно, объясните попроще или подкиньте ссылок на какую либо литературу в которой все это было бы достаточно доступно изложено. заранее спасибо:)
C++ Завершить программу http://www.cyberforum.ru/cpp-beginners/thread538308.html
Создать класс“Сотрудник”, состоящей из класса ”Зарплата”. Класс “Сотрудник ”: фамилия сотрудника, должность Класс “Зарплата ”: зарплата за последнии три года. *Определить фамилию сотрудника с наибольшим общим доходом #include <iostream> #include <Windows.h> using namespace std; class Sotrydnik{ char familiya; char doljnost;
C++ Алгоритмы из <algorithm> являются макросами или всё же функциями? Интересно насколько эффективно использовать тривиальные алгоритмы из библиотеки <algorithm>? Кто-нибудь использует их вообще? Сильно ли они тормозят программу при частой обработке сравнительно немалых контейнеров? Ведь, если предположить, что на каждый элемент вызывается функция, то быстродействие должно оставлять желать лучшего. С другой стороны, может в негласном стандарте предусмотрена... подробнее

Показать сообщение отдельно
rovel
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 25
04.04.2012, 01:25     Помогите разобраться с кодом. Класс, описывающий длинное вещественное число.
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
#include <deque>
#include <string>
#include <algorithm>
#include <vector>
 
using namespace std;
 
// Класс, описывающий длинное вещественное число
class LongNumber
{
public:
    // Контейнер, содержащия цифры в десятичной записи числа
    deque<char> number;
    // Длина вещественной части числа
    int fraction;
    // Корректно ли число
    bool error;
    // Отрицательное ли число
    bool minus;
 
    // Конструктор класса
    LongNumber(string number)
    {
        // Устанавливаем длину вещественной части равной нулю
        fraction = 0;
        // Число корректно и не отрицательно
        error = minus = false;
        // Преобразуем число из строки во внутреннее представление
        for(int i = 0;i < number.size();++i)
            // Если символ '-'
            if(number[i] == '-')
                // Установить флаг
                minus = true;
            // Если встретился разделитель
            else if(number[i] == '.')
                // Установить длину вещественной части
                this->fraction = number.size() - i - 1;
            // Иначе
            else
                // Занести в цифру в контейнер
                this->number.push_back(number[i] - '0');
        // Удалить ведущие и конечные нули
        erase_zeros();
    }
 
    // Перегрузка оператора сравнения (без учета знака)
    int operator<=(const LongNumber &b)
    {
        // Если длина первого числа меньше второго
        if(number.size() - fraction < b.number.size() - b.fraction)
            // Вернуть единицу
            return 1;
        // Если длина первого числа больше второго
        if(number.size() - fraction > b.number.size() - b.fraction)
            // Вернуть ноль
            return 0;
        // Сравниваем посимвольно
        for(int i = 0;i < number.size() && i < b.number.size();++i)
            // Если текущие символы не равны
            if(number[i] != b.number[i])
                // Сравнить их и вернуть результат
                return number[i] <= b.number[i];
        // Вернуть единицу (цисла равны)
        return 1;
    }
 
    // Перегрузка оператора вычитания длинных чисел
    LongNumber operator-(LongNumber b)
    {
        // Создаем длинное число для результата вычитания
        LongNumber tmp("0");
        // Очищаем список цифр
        tmp.number.clear();
        // Выравниваем длину дробной части делимого
        while(fraction < b.fraction)
            number.push_back(0), fraction++;
        // Выравниваем длину дробной части делителя
        while(fraction > b.fraction)
            b.number.push_back(0), b.fraction++;
        // Задаем длину дробной части результата
        tmp.fraction = fraction;
        // Пока второе число короце первого
        while(number.size() != b.number.size())
            // Дополняем ведущими нулями второе число
            b.number.push_front(0);
        // Создаем переменную для хранения информации о заеме в старшем разряде
        int p = 0;
        // Выполняем посимвольное вычитание от младших разрядов к старшим
        for(int i = number.size() - 1;i >= 0;--i)
            // Если цифра в текущем разряде вычитаемого больше чем у уменьшаемого
            if(b.number[i] > number[i] - p)
            {
                // Производим вычитание
                tmp.number.push_front(number[i] + 10 - p - b.number[i]);
                // Указываем, что был заем в старшем разряде
                p = 1;
            }
            // Иначе
            else
            {
                // Производим вычитание
                tmp.number.push_front(number[i] - p - b.number[i]);
                // Указываем, что заем не производился
                p = 0;
            }
        // Возвращаем результат вычитания, предварительно удалив ведущие нули
        return tmp.erase_zeros();
    }
 
    // Функция, которая умножает число на 10 и прибавляет к младшему разряду цифру b
    LongNumber mult_and_add(int b)
    {
        // Помещаем цифру в конец числа
        number.push_back(b);
        // Возвращаем результат, предварительно удалив нули
        return this->erase_zeros();
    }
 
    // Удаление ведущих и конечных нулей
    LongNumber erase_zeros()
    {
        // Пока в конце числа есть ноль и длина вещественной части больше нуля
        while(number.back() == 0 && fraction > 0)
        {
            // Удаляем ноль с конца
            number.pop_back();
            // Уменьшаем длину вещественной части
            fraction--;
        }
        //  Пока в начале числа есть ноль и длина числа больше единицы
        while(number.front() == 0 && number.size() > 1)
            // Удаляем ноль с начала
            number.pop_front();
        // Если число меньше единицы, а ведущего нуля в записи нет
        if(number.size() == fraction)
            // Добавить ведущий ноль
            number.push_front(0);
        // Вернуть результат
        return *this;
    }
 
    // Преобразование длинного числа в строку
    string to_str()
    {
        // Создаем переменную для хранения результата
        string res;
        // Если чесло отрицательное
        if(minus)
            // Поместить в строку знак '-'
            res += '-';
        // Для каждого числа из списка
        for(int i = 0;i < number.size();++i)
        {
            // Если оставшаяся длин равна длине вещественной части
            if(number.size() - i == fraction)
                // Добавить к строке символ разделителя
                res += ".";
            // Добавить к результату текущую цифру
            res += '0' + number[i];
        }
        // Вернуть полученную строку
        return res;
    }
};
 
// Функция для вычисления остатка от деления a на b
LongNumber mod(LongNumber a, LongNumber b)
{
    // Создаем длинное число для результата
    LongNumber res("0");
    // Если число b - ноль
    if(b.number.size() == 1 && b.number[0] == 0)
    {
        // Установить флаг ошибки
        res.error = true;
        // Вернуть результат
        return res;
    }
    // Находим на сколько можно уменьшить дробную часть
    int shift = min(a.fraction, b.fraction);
    // Запоминаем длину дробной часли делителя
    int len = b.fraction;
    // Уменьшаем дробную часть
    a.fraction -= shift;
    // Уменьшаем дробную часть
    b.fraction -= shift;
    // Пока дробная часть второго числа не равна нулю
    while(b.fraction > 0)
    {
        // Уменьшаем дробную часть
        b.fraction--;
        // Добавляем в конец первого числа ноль
        a.number.push_back(0);
    }
    // Идем по цифрам делимого
    for(int i = 0;i < a.number.size() - a.fraction;++i)
    {
        // Дописываем в конец результата текущую цифру 
        res.mult_and_add(a.number[i]);
        // Пока делитель меньше либо равен результату
        while(b <= res)
            // Вычитаем из результата делитель
            res = res - b;
    }
    // Идем по цифрам дробной части делимого
    for(int i = a.number.size() - a.fraction;i < a.number.size();++i)
        // Дописываем их к результату
        res.number.push_back(a.number[i]);
    // Устанавливаем длину дробной части результата
    res.fraction = a.fraction + len;
    // Если делимое и делитель отрицательны
    if(a.minus && b.minus)
        // Результат отрицательный
        res.minus = true;
    // Если делимое отрицательное
    else if(a.minus)
        // Результат равен разности делителя и текущего результата
        res = b - res;
    // Если делитель отрицательный
    else if(b.minus)
    {
        // Результат равен разности делителя и текущего результата
        res = b - res;
        // Со знаком минус
        res.minus = true;
    }
    // Вернуть результат, убрав ненужные нули
    return res.erase_zeros();
}
 
// Функция для нахождения остатков набора пар чисел
vector<LongNumber> calculate(vector<pair<LongNumber, LongNumber> > data)
{
    // Создаем контейнер для хранения результата
    vector<LongNumber> result;
    // Для каждой пары из набора
    for(int i = 0;i < data.size();++i)
        // Найти остаток и поместить его в результат
        result.push_back(mod(data[i].first, data[i].second));
    // Вернуть результат
    return result;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 13:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru