2022-09-15 08:40:48 +03:00
|
|
|
|
#pragma once
|
|
|
|
|
/*
|
|
|
|
|
Класс Number -- класс положительных больших чисел
|
|
|
|
|
|
|
|
|
|
Большое число будет храниться в динамическом массиве data
|
|
|
|
|
Каждый элемент этого массива содержит разряд числа в 100-ричной системе счисления
|
|
|
|
|
(так как base = 100)
|
|
|
|
|
По сути, каждый элемент data хранит две цифры числа в десятичной записи
|
|
|
|
|
|
|
|
|
|
Значение 100 для системы счисления выбрано как компромис между
|
|
|
|
|
эффективностью и удобством написания программы.
|
|
|
|
|
Если выбрать значения базы 10 - то программа будет не так эффективна по памяти
|
|
|
|
|
Если выбрать значения базы 256 (максимально эффективное использование памяти для типа char),
|
|
|
|
|
то алгоритм печати на экран сильно усложнится
|
|
|
|
|
В качестве альтернативы, можно было выбрать базу 1e9,
|
|
|
|
|
изменив при этом тип элементов c char на int
|
|
|
|
|
|
|
|
|
|
capacity - размер массива data
|
|
|
|
|
size - сколько ячеек занимет число в массиве data
|
|
|
|
|
size <= capacity
|
|
|
|
|
|
|
|
|
|
Для удобства разряды числа хранятся в обратном порядке
|
|
|
|
|
Например, число 12345678 соответствует массиву
|
|
|
|
|
data = {78, 56, 34, 12}
|
|
|
|
|
(это упрощает многие алгоритмы с такими числами)
|
|
|
|
|
*/
|
|
|
|
|
|
2022-09-15 10:29:14 +03:00
|
|
|
|
class Number {
|
|
|
|
|
private:
|
2022-09-15 08:40:48 +03:00
|
|
|
|
static const int base = 100;
|
2022-09-15 10:29:14 +03:00
|
|
|
|
std::size_t size;
|
|
|
|
|
std::size_t capacity;
|
|
|
|
|
char *data;
|
2022-09-15 08:40:48 +03:00
|
|
|
|
|
2022-09-15 10:29:14 +03:00
|
|
|
|
public:
|
2022-09-15 08:40:48 +03:00
|
|
|
|
|
2022-09-15 10:29:14 +03:00
|
|
|
|
Number(int a);
|
|
|
|
|
Number();
|
2022-09-15 08:40:48 +03:00
|
|
|
|
// Конструктор копирования
|
2022-09-15 10:29:14 +03:00
|
|
|
|
Number(const Number & n);
|
|
|
|
|
Number(const char *str);
|
2022-09-15 08:40:48 +03:00
|
|
|
|
~Number();
|
2022-09-15 10:29:14 +03:00
|
|
|
|
Number & operator=(const Number & right);
|
2022-09-15 08:40:48 +03:00
|
|
|
|
|
|
|
|
|
Number operator+(Number a);
|
2022-09-15 10:29:14 +03:00
|
|
|
|
void operator+=(const Number & a);
|
2022-09-15 08:40:48 +03:00
|
|
|
|
|
|
|
|
|
bool isEven() const;
|
|
|
|
|
|
2022-09-15 10:29:14 +03:00
|
|
|
|
Number operator*(const Number & right) const;
|
|
|
|
|
void operator*=(const Number & a);
|
2022-09-15 08:40:48 +03:00
|
|
|
|
|
2022-09-15 10:29:14 +03:00
|
|
|
|
bool operator==(const Number & a) const;
|
|
|
|
|
bool operator!=(const Number & a) const;
|
|
|
|
|
bool operator>(const Number & a) const;
|
|
|
|
|
bool operator<(const Number & a) const;
|
2022-09-15 08:40:48 +03:00
|
|
|
|
void div2();
|
|
|
|
|
|
2022-09-15 10:29:14 +03:00
|
|
|
|
friend std::ostream & operator<<(std::ostream & stream,
|
|
|
|
|
const Number & right);
|
2022-09-15 08:40:48 +03:00
|
|
|
|
};
|
|
|
|
|
|
2022-09-15 10:29:14 +03:00
|
|
|
|
std::ostream & operator<<(std::ostream & stream, const Number & right);
|