#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}
    (это упрощает многие алгоритмы с такими числами)
*/

class Number {
  private:
    static const int base = 100;
     std::size_t size;
     std::size_t capacity;
    char *data;

  public:

     Number(int a);
     Number();
    // Конструктор копирования
     Number(const Number & n);
     Number(const char *str);
    ~Number();
     Number & operator=(const Number & right);

    Number operator+(Number a);
    void operator+=(const Number & a);

    bool isEven() const;

    Number operator*(const Number & right) const;
    void operator*=(const Number & a);

    bool operator==(const Number & a) const;
    bool operator!=(const Number & a) const;
    bool operator>(const Number & a) const;
    bool operator<(const Number & a) const;
    void div2();

    friend std::ostream & operator<<(std::ostream & stream,
				     const Number & right);
};

std::ostream & operator<<(std::ostream & stream, const Number & right);
