This repository has been archived on 2023-05-13. You can view files and clone it, but cannot push or open issues or pull requests.
mipt_cpp/seminar02_encapsulation/1number/number.h

64 lines
2.6 KiB
C
Raw Normal View History

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);